上QQ阅读APP看书,第一时间看更新
2.2.7 验证synchronized(this)同步代码块是锁定当前对象的
和synchronized方法一样,synchronized(this)同步代码块也是锁定当前对象的。
创建t8项目,文件Task.java代码如下:
package mytask; public class Task { public void otherMethod() { System.out.println("------------------------run--otherMethod"); } public void doLongTimeTask() { synchronized (this) { for (int i = 0; i < 10000; i++) { System.out.println("synchronized threadName=" + Thread.currentThread().getName() + " i=" + (i + 1)); } } } }
文件MyThread1.java代码如下:
package mythread; import mytask.Task; public class MyThread1 extends Thread { private Task task; public MyThread1(Task task) { super(); this.task = task; } @Override public void run() { super.run(); task.doLongTimeTask(); } }
文件MyThread2.java代码如下:
package mythread; import mytask.Task; public class MyThread2 extends Thread { private Task task; public MyThread2(Task task) { super(); this.task = task; } @Override public void run() { super.run(); task.otherMethod(); } }
文件Run.java代码如下:
package test; import mytask.Task; import mythread.MyThread1; import mythread.MyThread2; public class Run { public static void main(String[] args) throws InterruptedException { Task task = new Task(); MyThread1 thread1 = new MyThread1(task); thread1.start(); Thread.sleep(100); MyThread2 thread2 = new MyThread2(task); thread2.start(); } }
程序运行结果如图2-27所示。
图2-27 异步输出
更改Task.java代码如下:
package mytask; public class Task { synchronized public void otherMethod() { System.out.println("------------------------run--otherMethod"); } public void doLongTimeTask() { synchronized (this) { for (int i = 0; i < 10000; i++) { System.out.println("synchronized threadName=" + Thread.currentThread().getName() + " i=" + (i + 1)); } } } }
程序运行结果如图2-28所示。
图2-28 同步输出
同步输出的原因是使用synchronized (this)同步代码块将当前类的对象作为锁,使用synchronized public void otherMethod()同步方法将当前方法所在类的对象作为锁,两者是一把锁,所以运行结果呈同步的效果。