浅谈线程中的同步概念和synchronized关键字.docx

浅谈线程中的同步概念和synchronized关键字.docx

ID:51797971

大小:34.55 KB

页数:3页

时间:2020-03-15

浅谈线程中的同步概念和synchronized关键字.docx_第1页
浅谈线程中的同步概念和synchronized关键字.docx_第2页
浅谈线程中的同步概念和synchronized关键字.docx_第3页
资源描述:

《浅谈线程中的同步概念和synchronized关键字.docx》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

1、浅谈线程中的同步概念和synchronized关键字不少同学在学习Java中的多线程这一章时,都会觉得脑子很乱,觉得这一章的知识点太难以理解。特别是对于其中线程同步(synchronized)更是迷茫。本文试图以浅显的例子来跟大家共同分享学习心得。先看一个例子packagecom.chinasofti.thread;publicclassMyThreadimplementsRunnable{privateinta=1;publicsynchronizedvoidf1(){System.out.println("a="+a);try{Thread.sleep(10

2、00);}catch(InterruptedExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}System.out.println("a="+a);}publicvoidf2(){a++;}publicvoidrun(){f1();}publicstaticvoidmain(String[]args){MyThreadmyThread=newMyThread();Threadt1=newThread(myThread);t1.start();try{Thread.sleep(100);}

3、catch(InterruptedExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}myThread.f2();}}例子说明:我们自定义了一个MyThread类,该类实现了java.lang.Runnable接口。类中包含一个静态私有变量a=1;提供了一个同步方法f1,该方法的作用是先打印a,然后执行该方法的线程休眠1000毫秒,再次打印a;提供了一个非同步方法f2,该方法作用是使a自加1;实现java.lang.Runnable接口的run方法,该方法执行f1()。程序启动时,首先启动

4、主线程执行main方法。在main方法中,先new一个MyThread类对象myThread,再利用该对象创建一条线程t1,调用其start()方法启动线程,主线程休眠100毫秒的作用是使得t1在主线程休眠期间得到CPU执行权,执行到f1()方法中的Thread.sleep(1000)处。在t1线程休眠1000毫秒时,主线程继续执行MyThread.f2()。该测试程序的最终结果是打印a=1a=2。也就是说在t1线程执行同步方法f1并休眠1000毫秒的空当里,主线程执行了myThread对象的非同步方法f2(),修改了a的值。t1线程从休眠中恢复过来再次打印a的

5、值已经变成了2。也许有同学看到这里就有疑问了:“我们不是说synchronized的意思是获得对象锁吗?那么t1线程执行了同步方法f1(),那就应该获得myThread对象的对象锁啊,怎么在它休眠期间另一条线程主线程也能够执行myThread对象的f2()方法呢?难道是因为t1线程休眠了之后就释放掉对象锁了吗?”对于这个问题的解释是这样,t1线程执行run()方法,run()方法调用同步方法f1(),则此时t1线程拥有了myThread这个对象的对象锁,接下来执行Thread.sleep(longmiliseconds)这个方法,则线程(即t1)进入休眠状态,但

6、是Thread.sleep(longmiliseconds)的执行不会导致线程释放掉对象锁。而main线程之所以能够在t1线程休眠之后继续执行myThread.f2(),是因为f2()并不是同步方法。我们通常说“获得对象锁”,实际上更确切直白的含义是“独占该对象的同步方法和同步代码块”。但是对于非同步方法,对象锁是不起作用的。我们可以将例子做如下改动:将f2()修改为同步方法,其他不变。大家有兴趣试一下会发现此时的程序执行结果变成了打印a=1a=1。因为此时f2()为同步方法,t1线程在休眠期间并没有释放对象锁,即此时t1线程“独占myThread对象的f1()

7、,f2()方法”。因此此时主线程不可能执行myThread.f2()。只有当t1线程执行完了f1()方法之后,即两次打印a=1a=1,释放掉对象锁,此时主线程才能继续执行myThread的同步方法f2()。很多同学在理解“同步”这个概念时错误地将其理解成为“并行”,从而得到一些混乱的结论,最后变得越来越茫然。而通过上面的例子我们可以看到,其实线程中“同步”的概念更接近于“串行”。即“同一时刻只能有一条线程拥有一个对象的对象锁,在该线程独占该对象的同步方法和同步代码块时,其他线程不能访问该对象的同步方法和同步代码块”。而synchronized关键字的作用是声明同

8、步方法或者同步代码块,执

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。