- 1、本文档共116页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
catch (InterruptedException e){ } System.out.println(Thread.currentThread().getName( ) + exit method1); } } public void method2( ){ synchronized (this){ //同步块 System.out.println(Thread.currentThread( ).getName( ) + enter method2); try{ Thread.sleep(3000); } catch (InterruptedException e){ } System.out.println(Thread.currentThread( ).getName( ) + exit method2); } }} class HelloSynchronizedRunnalbe implements Runnable{ private HelloSynchronized helloSynchronized; private String methodName; public HelloSynchronizedRunnalbe(HelloSynchronized helloSynchronized, String methodName){ this.helloSynchronized = helloSynchronized; this.methodName = methodName; } public void run( ){ if (methodName.equals(method1)){ helloSynchronized.method1( ); } else if (methodName.equals(method2)){ helloSynchronized.method2( ); } }}程序运行结果:t1 enter method1t1 exit method1t2 enter method2t2 exit method2 由此可见,线程对象t1和t2的执行过程是:等到线程t1结束后,t2才开始运行(t2受到阻塞)。再把synchronized (this){}去掉,程序运行结果: t1 enter method1 t2 enter method2 t1 exit method1 t2 exit method2 由此可见,由于没有了同步控制机制,因此线程t1、t2同时运行。 同步方法示例: synchronized private void sellBook(Book book){ ... } //这种方法其实相当于: private void sellBook(Book book){ synchronized(this) { ... } } 因为默认采用this作为同步对象,所以当一个类中有多个synchronized方法时,同样会存在以上问题,即如果有一个线程访问其中某个synchronized方法,直到该方法执行完毕,其他线程对其他synchronized方法的访问也将受到阻塞。 可以把上面的例子稍加改造,去掉代码中的synchronized (this),改为synchronized public void method1( ),synchronized public void method2( )同步形式,运行后会得到同样结果。 多同步代码块synchronized(this){...}的多线程阻塞问题(包括synchronized同步方法),在并发处理的系统中(比如Web服务器)会严重影响性能,建议慎重使用。可以使用synchronized(obj){...}缩小同步资源对象的范围来解决这个问题。 9.3.2 使用ReentrantLock 和ReentrantReadWriteLock类同步线程 ReentrantLock 和ReentrantReadWriteLock类位于Java.util.concurrent.locks包中。 J2SE 5.0加入了ReentrantLock和ReentrantReadWriteLock可以对线程进行同步,这里举一个最简单的例子对其加以说明: class X{ private final ReentrantLock lock = new ReentrantLo
文档评论(0)