欢迎来到天天文库
浏览记录
ID:38289542
大小:24.73 KB
页数:13页
时间:2019-06-07
《synchronized(this)的一些理解》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、对synchronized(this)的一些理解一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。二、然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。三、尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchron
2、ized(this)同步代码块的访问将被阻塞。四、第三个例子同样适用其它同步代码块。也就是说,当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个object的对象锁。结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。五、以上规则对其它对象锁同样适用.举例说明:一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。packageths;publicclassThre
3、ad1implementsRunnable{publicvoidrun(){synchronized(this){for(inti=0;i<5;i++){System.out.println(Thread.currentThread().getName()+"synchronizedloop"+i);}}}publicstaticvoidmain(String[]args){Thread1t1=newThread1();Threadta=newThread(t1,"A");Threadtb=newThread(t1,"B");ta.start();tb.start();}
4、}结果:Asynchronizedloop0Asynchronizedloop1Asynchronizedloop2Asynchronizedloop3Asynchronizedloop4Bsynchronizedloop0Bsynchronizedloop1Bsynchronizedloop2Bsynchronizedloop3Bsynchronizedloop4二、然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。packageths;pub
5、licclassThread2{publicvoidm4t1(){synchronized(this){inti=5;while(i-->0){System.out.println(Thread.currentThread().getName()+":"+i);try{Thread.sleep(500);}catch(InterruptedExceptionie){}}}}publicvoidm4t2(){inti=5;while(i-->0){System.out.println(Thread.currentThread().getName()+":"+i);try{T
6、hread.sleep(500);}catch(InterruptedExceptionie){}}}publicstaticvoidmain(String[]args){finalThread2myt2=newThread2();Threadt1=newThread(newRunnable(){publicvoidrun(){myt2.m4t1();}},"t1");Threadt2=newThread(newRunnable(){publicvoidrun(){myt2.m4t2();}},"t2");t1.start();t2.start();}}结果:t1:4t2
7、:4t1:3t2:3t1:2t2:2t1:1t2:1t1:0t2:0三、尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。//修改Thread2.m4t2()方法:publicvoidm4t2(){synchronized(this){inti=5;while(i-->0){System.out.println(Thread.currentThread().getName()+":"+i)
此文档下载收益归作者所有