当前位置: 代码迷 >> J2SE >> 新手求解。synchronized 的有关问题。
  详细解决方案

新手求解。synchronized 的有关问题。

热度:319   发布时间:2016-04-24 02:15:24.0
新手求解。。。。synchronized 的问题。。。
Java code
public class TT implements Runnable { int b = 100; public synchronized void m1() throws Exception {  // Thread.sleep(2000);  System.out.println("m11");  b = 1000;  Thread.sleep(5000);  System.out.println("m12"); } public synchronized void m2() throws Exception {  System.out.println("m21");  Thread.sleep(2500);  b = 2000;  System.out.println("m22"); } public void run() {  try {   System.out.println("run");   m1();  } catch (Exception e) {   e.printStackTrace();  } } public static void main(String[] args) throws Exception {  TT tt = new TT();  Thread t = new Thread(tt);  t.start();//run();  tt.m2();  System.out.println(tt.b); }}

请问为什么运行的结果是m21 run m22 m11 1000 m12
run()比m2()还慢运行????

------解决方案--------------------
这个多线程的时候并不能看表面上应该是谁运行的,因为一旦是多线程就涉及到抢占CPU以及其他资源的问题,虽然你启动了线程,然后系统的确是会去执行run方法,但是并不能保证把run方法里的全部语句都执行完,也有可能是在执行run方法里的m1方法之前CPU就被分配去执行m2方法了的,就想操作系统里的时间片的那种说法哈~一个时间片结束了,但是这个方法还没执行完照样也会去执行其他线程里的语句的呢~
------解决方案--------------------
http://blog.csdn.net/mengxiangyue/article/details/6871219
线程同步问题
------解决方案--------------------
这个跟cpu设定的时间片有关系应该是,main线程先使用一个时间片执行了System.out.println("m21");
然后轮到t.start()去执行System.out.println("run");
每次都是main先使用一个时间片,然后才是启动的线程
------解决方案--------------------
关键在于理解synchronized(同步)。m1和m2都加synchronized运行时必须先m2运行完结,再运行m1。m1或者m2其中一个不加synchronized运行不需要“等”。。。
  相关解决方案