黑马程序员技术交流社区

标题: 多线程 synchronized问题 [打印本页]

作者: 邱成    时间: 2012-9-14 22:27
标题: 多线程 synchronized问题
本帖最后由 邱成 于 2012-9-15 07:09 编辑

public class TT implements Runnable {
int b = 100;
public synchronized void m1() throws Exception{
  b = 1000;
  Thread.sleep(1000);
  System.out.println("b = " + b);
}
public void m2() {
  System.out.println(b);
}
public void run() {
  try {
   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();
  Thread.sleep(100);
  tt.m2();
}
}

运行结果为
1000
b=1000

我的问题是: 如果要在m2的方法上加synchronized
也就是变为public synchronized void m2() throws Exception{
.....
}
为什么输出结果就变了,输出结果为:
b=1000
1000

另外问一下:
java 中,synchronized 修饰不同方法有何区别?
synchronized {修饰代码块}
synchronized {static方法}
synchronized {run方法}
synchronized {普通方法}
有什么区别?
作者: 武庆东    时间: 2012-9-14 22:35
本帖最后由 武庆东 于 2012-9-14 22:55 编辑

public class TT implements Runnable {
int b = 100;
public synchronized void m1() throws Exception{
  b = 1000;
  Thread.sleep(1000);
  System.out.println("b = " + b);
}
public void m2() {
  System.out.println(b);
}
public void run() {
  try {
   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();
  Thread.sleep(100);
  tt.m2();
}
}

运行结果为
1000
b=1000


我的问题是: 如果要在m2的方法上加synchronized
也就是变为public synchronized void m2() throws Exception{
.....
}
为什么输出结果就变了,输出结果为:
b=1000
1000
解释:这里应该不是你加不加synchronized的问题,多运行几次,结果顺序会有所不同!

另外问一下:
java 中,synchronized 修饰不同方法有何区别?
synchronized {修饰代码块}
synchronized {static方法}
synchronized {run方法}
synchronized {普通方法}
有什么区别?
这里的重点是synchronized的用法:
    1.当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。
      另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。
    2.当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。
    3当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。
    4.第三个例子同样适用其它同步代码块。也就是说,当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个object的对象锁。结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2