请看程序
public class TT implements Runnable{
public static void main(String[] args) throws Exception{
TT tt=new TT();
Thread t=new Thread(tt);
t.start();
Thread.sleep(2000);
tt.m2();
}
int b=100;
public synchronized void m1() throws Exception{
b=2000;
System.out.println("b1="+b);
Thread.sleep(5000);
System.out.println("b2="+b);
}
public void m2(){
b = 3000;
System.out.println(b);
}
public void run() {
try{
m1();
}
catch(Exception ex){
System.out.println(ex.getStackTrace());
}}
}
这段程序的输出结果是
b1=2000
3000
b2=3000
我不明白的地方在于:m1已经将b这个变量锁定,为什么m2方法还能将其修改呢?
------解决方案--------------------
当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。
只有当两个方法都是synchronized 且占有公共资源时,才会先执行完一个,再执行另一个
------解决方案--------------------
首先你锁定的是方法m1,而不是只有都是synchronized才会同时占有。否则你的main线程和run线程会同时只行的(理想状态下),在你执行run时m2是释放的,mian线程可以去执行的。你把第一个sleep的值改成6000,或者8000.你应该会看到不一样的结果