该程序的输出结果?

  无心中了解到以下题目,以为蛮好。
  
  题目以下:}}}}}}该程序的输出结果?
  
  程序输出结果或考察知识点实例锁。
  
  并发下的内存可见性。
  
  在java中,多线程的程序最难理解、调试,不少时候执行结果并不像咱们想象的那样执行。因此在java多线程特别难,依稀记得大学的时候考c语言二级的时候,里面的题目是什么++和不少其余优先级的符号在一块儿问最后的输出结果,这类题目就想考一些运行符优先级和结合性问题。那个背背就好了,可是java多线程仍是须要好好理解才行,靠背是不行的。
  
  下面开始简单分析:该题目涉及到2个线程(主线程main、子线程)、关键词涉及到synchronized、Thread.sleep。
  
  关键词仍是比较复杂的(可能有时候没有理解到位因此上面题目会有点误区),他的做用就是实现线程的同步(实现线程同步有不少方法,它只是一种,后续文章会说其余的,须要好好研究大神Doug Lea的一些实现),它的工做就是对须要同步的代码加锁,使得每一次只有一个线程能够进入同步块(实际上是一种悲观策略)从而保证线程只记得安全性。
  
  通常关键词synchronized的用法指定加锁对象:对给定对象加锁,进入同步代码前须要活的给定对象的锁。
  
  直接做用于实例方法:至关于对当前实例加锁,进入同步代码前要得到当前实例的锁。
  
  直接做用于静态方法:至关于对当前类加锁,进入同步代码前要得到当前类的锁。
  
  上面的代码,synchronized用法其实就 属于第二种状况。直接www.huachenguoj.com 做用于实例方法:至关于对当前实例加锁,进入同步代码前要得到当前实例的锁。
  
  可能存在的误区因为对synchronized理解的不到位,因为不少时候,咱们多线程都是操做一个synchronized的方法,当2个线程调用2个不一样synchronized的方法的时候,认为是没有关系的,这种想法是存在误区的。直接做用于实例方法:至关于对当前实例加锁,进入同步代码前要得到当前实例的锁。
  
  若是一个调用synchronized方法。另一个调用普通方法是没有关系的,2个是不存在等待关系的。
  
  这些对于后面的分析颇有做用。
  
  使当前线程(即调用该方法的线程)暂停执行一段时间,让其余线程有机会继续执行,但它并不释放对象锁。也就是说若是有synchronized同步快,其余线程仍然不能访问共享数据。注意该方法要捕捉异常,对于后面的分析颇有做用。一些细节能够参考个人系统学习java高并发系列二。
  
  分析流程都是从main方法执行的,上面说了有2个线程,可是这里就算修改线程优先级也没用,优先级是在2个程序都尚未执行的时候才有前后,如今这个代码一执行,主线程main已经执行了。对于属性变量 int b =100因为使用了synchronized也不会存在可见性问题(也没有必要再使用volatile申明),当执行1步骤的时候(Thread t = new Thread(tt); //1)线程是new状态,尚未开始工做。当执行2步骤的时候(t.start(); //2)当调用start方法,这个线程才正真被启动,进入runnable状态,runnable状态表示能够执行,一切准备就绪了,可是并不表示必定在cpu上面执行,有没有真正执行取决服务cpu的调度。在这里当执行3步骤一定是先得到锁(因为start须要调用native方法,而且在用完成以后在一切准备就绪了,可是并不表示必定在cpu上面执行,有没有真正执行取决服务cpu的调度,以后才会调用run方法,执行m1方法)。这里其实2个synchronized方法里面的Thread.sheep其实要不要是无所谓的,估计是就为混淆增长难度。3步骤执行的时候其实很快子线程也准备好了,可是因为synchronized的存在,而且是做用同一对象,因此子线程就只有必须等待了。因为main方法里面执行顺序是顺序执行的,因此必须是步骤3执行完成以后才能够到4步骤,而因为3步骤执行完成,子线程就能够执行m1了。这里www.bomaoyuLe.cn 就存在一个多线程谁先获取到的问题,若是4步骤先获取那么main thread b=2000,若是子线程m1获取到可能就b已经赋值成1000或者尚未来得及赋值4步骤就输出了可能结果就是main thread b=1000或者main thread b=2000,在这里若是把6步骤去掉那么b=执行在前和main thread b=在前就不肯定了。可是因为6步骤存在,因此无论怎么都是main thread b=在前面,那么等于1000仍是2000看状况,以后b=1000是必定固定的了。
  
  多线程一些建议线程也很珍贵,因此建议使用线程池,线程池用的不少,后续准备分享下,特别重要,须要作到心中有数。
  
  给线程起名字,当线上cpu高的时候,须要用到高级jstack,若是有名称就方便不少。
  
  多线程特别须要注意线程安全问题,也须要了解jdk那些是线程安全不安全,那样使用的时候不会出现莫名其妙问题。
  
  还有一些技巧后续文章分享在慢慢提,多线程特别重要,也特别难,www.t1yule.com但愿你们也多多花心思在上面。
  
  多线程的一些调试技巧因为断点,全部线程通过断点的时候,都须要停下,致使这个点不停的断住,很难受,eclispe里面有条件断点,当知足条件的时候就能够停下来,那么这样就方便了。
  
  关于线程dump分析以及后续线程内容会在后面继续分析分享。java

相关文章
相关标签/搜索