上QQ阅读APP看书,第一时间看更新
2.2.3 用同步代码块解决同步方法的弊端
创建t6项目,将t5项目中的所有文件复制到t6项目中,并更改文件Task.java代码如下:
package mytask; public class Task { private String getData1; private String getData2; public void doLongTimeTask() { try { System.out.println("begin task"); Thread.sleep(3000); String privateGetData1 = "长时间处理任务后从远程返回的值1 threadName=" + Thread.currentThread().getName(); String privateGetData2 = "长时间处理任务后从远程返回的值2 threadName=" + Thread.currentThread().getName(); synchronized (this) { getData1 = privateGetData1; getData2 = privateGetData2; System.out.println(getData1); System.out.println(getData2); System.out.println("end task"); } } catch (InterruptedException e) { e.printStackTrace(); } } }
程序运行结果如图2-22所示。
图2-22 运行速度很快
通过上面的示例可以得出,当一个线程访问object对象的一个synchronized同步代码块时,另一个线程仍然可以访问该对象中的非synchronized(this)同步代码块。
通过示例,时间虽然缩短,加快了运行效率,但同步synchronized(this)代码块真的是同步的吗?它真的持有当前调用对象的锁吗?是的,但必须用代码的方式来进行验证。