1.synchronized(object)java
package test.thread; import java.io.IOException; import org.junit.Test; /* * 測試線程鎖 */ public class TestBlock { public static void main(String[] args) { TestBlock test = new TestBlock(); MyTest thread1 = test.new MyTest(test); thread1.setName("1"); MyTest thread2 = test.new MyTest(test); thread2.setName("2"); thread1.start(); thread2.start(); } /* * 測試同步 */ class MyTest extends Thread{ private Object o; public MyTest(Object o){ this.o=o; } @Override public void run() { // TODO Auto-generated method stub synchronized (o) { //這個o是test對象的實例 ,對類對象實例進行加鎖,當線程調用一個實例運行的,另外的線程調用這個實例時候阻塞,達到上鎖的目的 try { for(int a=0;a<3;a++){ System.out.println("線程"+MyTest.currentThread().getName()+"修改a=="+a); //MyTest.yield(); } } catch (Exception e) { // TODO: handle exception } } } } }
返回的結果:
·
線程1修改a==0
線程1修改a==1
線程1修改a==2
線程1修改a==3
線程1修改a==4
線程1修改a==5
線程1修改a==6
線程1修改a==7
線程1修改a==8
線程1修改a==9
線程2修改a==0
線程2修改a==1
線程2修改a==2
線程2修改a==3
線程2修改a==4
線程2修改a==5
線程2修改a==6
線程2修改a==7
線程2修改a==8
線程2修改a==9ide
能夠看到當一個線程運行完畢以後才運行第二個線程
2.synchronized(this)測試
package test.thread; import java.io.IOException; import org.junit.Test; /* * 測試線程鎖 */ public class TestBlock { //調用類 public static void main(String[] args) { TestBlock test = new TestBlock(); MyTest thread1 = test.new MyTest(test); thread1.setName("1"); MyTest thread2 = test.new MyTest(test); thread2.setName("2"); thread1.start(); thread2.start(); } /* * 測試同步 */ class MyTest extends Thread{ private Object o; public MyTest(Object o){ this.o=o; } @Override public void run() { // TODO Auto-generated method stub synchronized (this) { //this 指代當時類 也就是MyTest,兩個線程同時調用同一個類方法。就是兩個線程對兩個實例的各自上鎖。互相不阻塞
try { for(int a=0;a<10;a++){ System.out.println("線程"+MyTest.currentThread().getName()+"修改a=="+a); //MyTest.yield(); } } catch (Exception e) { // TODO: handle exception } } } } }
返回的結果:
線程1修改a==0
線程1修改a==1
線程1修改a==2
線程1修改a==3
線程1修改a==4
線程2修改a==0
線程1修改a==5
線程1修改a==6
線程1修改a==7
線程1修改a==8
線程1修改a==9
線程2修改a==1
線程2修改a==2
線程2修改a==3
線程2修改a==4
線程2修改a==5
線程2修改a==6
線程2修改a==7
線程2修改a==8
線程2修改a==9this