public class TT implements Runnable {
int b = 100;
public synchronized void m1() {
b = 1000;
System.out.println("b = " + b);
}
public synchronized void m2() throws Exception {
Thread.sleep(1000);
b = 2000;
}
public void run() {
m1();
}
public static void main(String[] args) throws Exception {
TT tt = new TT();
Thread t = new Thread(tt);
t.start();
tt.m2();
System.out.println(tt.b);
}
}
int b = 100;
public synchronized void m1() {
b = 1000;
System.out.println("b = " + b);
}
public synchronized void m2() throws Exception {
Thread.sleep(1000);
b = 2000;
}
public void run() {
m1();
}
public static void main(String[] args) throws Exception {
TT tt = new TT();
Thread t = new Thread(tt);
t.start();
tt.m2();
System.out.println(tt.b);
}
}
解决方案 »
- 关于socket通信的一个问题
- no swt-pi-gtk in java.library.path
- 怎么对时间进行加减操作?
- 救命啊,,,,,求SQL 查询语句
- 2.14是double,为什么?浮点数的取值范围怎么计算(如4个字节,有效位为7)?
- 一般,除了全角半角的空格之外,还有些什么样的空格?....烦,,,大家怎么过滤的?
- 两个Runtime.getRuntime().exec()的问题
- 我把JAVA的运行环境装到了WinMe的F:\jdk1.3目录下。还要进行如何的配制才能编译和运行java源文件。
- 关于时间问题,大虾教我,给50分!!跟贴有分!
- 我这个循环ip发送写出来 循环端口怎么加进去
- 3个小问题
- installanywhere 问题
b = 1000
它是先运行m2方法把b=2000带到main方法中打印b,接着在运行run方法到m1方法中。正常运行模式的结果是:1000
b=1000
它是先运行m2后直接运行run方法接着到m1方法中在到main方法把b打印出来b=1000;
原因是m1、m2都是sychronized方法,同一个时刻,只允许一个线程访问一个对象中的一个sychronized方法(例如有线程访问m1的时候,其他线程请求访问该对象的m2也不行)。那么输出的结果就跟线程的推进顺序有关了,主线程时间片没有结束,执行到tt.m2(),此时新建的线程就算执行到run()中访问m1,也会等待主线程执行完了m2,才能够执行m1,结果这两步完了后b还是等于1000.而后是1000 b=1000还是b=1000 1000跟线程的推进执行println的顺序有关,两种结果都是可能的。另一种可能的结果是子线程推进比主线程快,执行到了run中的m1,则会阻塞主线程访问m2,子线程执行完m1后主线程才能访问m2,这时候也是由于线程推进顺序的影响,可能会有2000 b=1000和b=1000 1000这两种结果。