和synchronized方法一样,synchronized(this)代码块也是锁定当前对象的。
package com.cky.utils; /** * Created by chenkaiyang on 2017/12/6. */ public class Task { public void otherMethod() { System.out.println("othermethod start"); } public void serviceMethodA(){ synchronized (this) { for (int i = 0; i < 100; i++) { System.out.println("同步"+ Thread.currentThread().getName() +" i="+(i+1)); } } } }
package com.cky.thread; import com.cky.utils.Task; /** * Created by chenkaiyang on 2017/12/5. */ public class ThreadA extends Thread{ private Task service; public ThreadA(Task service) { super(); this.service = service; } @Override public void run() { super.run(); service.serviceMethodA(); } }
package com.cky.thread; import com.cky.utils.Task; /** * Created by chenkaiyang on 2017/12/5. */ public class ThreadB extends Thread{ private Task service; public ThreadB(Task service) { super(); this.service = service; } @Override public void run() { super.run(); service.otherMethod(); } }
package com.cky.test; import com.cky.thread.ThreadA; import com.cky.thread.ThreadB; import com.cky.utils.Task; /** * Created by chenkaiyang on 2017/12/6. */ public class Test2 { public static void main(String[] args) throws InterruptedException { Task task = new Task(); ThreadA threadA = new ThreadA(task); threadA.start(); ThreadB threadB = new ThreadB(task); threadB.start(); } }
同步Thread-0 i=5 同步Thread-0 i=6 同步Thread-0 i=7 同步Thread-0 i=8 othermethod start 同步Thread-0 i=9 同步Thread-0 i=10
上面结果执行是异步执行的,下面更改othermethod
package com.cky.utils; /** * Created by chenkaiyang on 2017/12/6. */ public class Task { synchronized public void otherMethod() { System.out.println("othermethod start"); } public void serviceMethodA(){ synchronized (this) { for (int i = 0; i < 100; i++) { System.out.println("同步"+ Thread.currentThread().getName() +" i="+(i+1)); } } } }
同步Thread-0 i=94 同步Thread-0 i=95 同步Thread-0 i=96 同步Thread-0 i=97 同步Thread-0 i=98 同步Thread-0 i=99 同步Thread-0 i=100 othermethod start