A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 邱成 中级黑马   /  2012-9-14 22:27  /  1069 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 邱成 于 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 {普通方法}
有什么区别?

1 个回复

倒序浏览
本帖最后由 武庆东 于 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对象所有同步代码部分的访问都被暂时阻塞。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马