Java 多线程同步问题的探究(二、给我一把锁,我能创造一个规矩).docVIP

Java 多线程同步问题的探究(二、给我一把锁,我能创造一个规矩).doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Java 多线程同步问题的探究(二、给我一把锁,我能创造一个规矩)

在上一篇中,我们讲到了多线程是如何处理共享资源的,以及保证他们对资源进行互斥访问所依赖的重要机制:对象锁。 本篇中,我们来看一看传统的同步实现方式以及这背后的原理。 很多人都知道,在Java多线程编程中,有一个重要的关键字,synchronized。但是很多人看到这个东西会感到困惑:“都说同步机制是通过对象锁来实现的,但是这么一个关键字,我也看不出来Java程序锁住了哪个对象阿?“ 没错,我一开始也是对这个问题感到困惑和不解。不过还好,我们有下面的这个例程: 1 public class ThreadTest extends Thread { 2 3 private int threadNo; 4 5 public ThreadTest(int threadNo) { 6 this.threadNo = threadNo; 7 } 8 9 public static void main(String[] args) throws Exception { 10 for (int i = 1; i 10; i++) { 11 new ThreadTest(i).start(); 12 Thread.sleep(1); 13 } 14 } 15 16 @Override 17 public synchronized void run() { 18 for (int i = 1; i 10000; i++) { 19 System.out.println(No. + threadNo + : + i); 20 } 21 } 22 } 这个程序其实就是让10个线程在控制台上数数,从1数到9999。理想情况下,我们希望看到一个线程数完,然后才是另一个线程开始数数。但是这个程序的执行过程告诉我们,这些线程还是乱糟糟的在那里抢着报数,丝毫没有任何规矩可言。 但是细心的读者注意到:run方法还是加了一个synchronized关键字的,按道理说,这些线程应该可以一个接一个的执行这个run方法才对阿。 但是通过上一篇中,我们提到的,对于一个成员方法加synchronized关键字,这实际上是以这个成员方法所在的对象本身作为对象锁。在本例中,就是以ThreadTest类的一个具体对象,也就是该线程自身作为对象锁的。一共十个线程,每个线程持有自己 线程对象的那个对象锁。这必然不能产生同步的效果。换句话说,如果要对这些线程进行同步,那么这些线程所持有的对象锁应当是共享且唯一的! 我们来看下面的例程: 1 public class ThreadTest2 extends Thread { 2 3 private int threadNo; 4 private String lock; 5 6 public ThreadTest2(int threadNo, String lock) { 7 this.threadNo = threadNo; 8 this.lock = lock; 9 } 10 11 public static void main(String[] args) throws Exception { 12 String lock = new String(lock); 13 for (int i = 1; i 10; i++) { 14 new ThreadTest2(i, lock).start(); 15 Thread.sleep(1); 16 } 17 } 18 19 public void run() { 20 synchronized (lock) { 21 for (int i = 1; i 10000; i++) { 22 System.out.println(No. + threadNo + : + i); 23 } 24 } 25 } 26 } 我们注意到,该程序通过在main方法启动10个线程之前,创建了一个Strin

文档评论(0)

xcs88858 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档