首先,看如下代码,是一个同步方法锁的例子:
package sync;
public class TT implements Runnable{
int b=100;
//第三处 int c=100;
public synchronized void m1(){
//(第一处)System.out.println(Thread.currentThread().getName());
b=1000;
System.out.println(Thread.currentThread().getName());
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("b="+b);
}
public synchronized void m2(){
//(第二处)System.out.println(Thread.currentThread().getName());
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
b=2000;
}
public void run(){
m1();
}
public static void main(String[] args) {
TT tt=new TT();
Thread t=new Thread(tt);
t.start();
tt.m2();
//第四处:System.out.println(tt.c);
System.out.println(tt.b);
//第五处:System.out.println(tt.c);
}
m1和m2 方法都用了synchronized同步。
我是这样理解的,但不知道是否正确:当主线程main调用tt.m2()方法,获得了方法锁,并且锁住了变量b。
线程t无法继续执行m1()方法,因为m1()要对变量b进行操作,只有等m2方法执行完毕后,才能执行。
System.out.println(tt.b);带来的结果是b=1000;
以上程序执行后的结果如下:
1000
Thread-0
b=1000
那么问题来了!
情况1:当在程序第一处或者程序第二处位置添加语句:
System.out.println(Thread.currentThread().getName());
都会造成输出结果的改变,System.out.println(tt.b);带来的结果是b=2000;
情况2:在源程序基础上,在第二处添加语句:
System.out.println(Thread.currentThread().getName());
原本最后System.out.println(tt.b);带来的结果是b=2000。但是,
如果继续在//第三处添加int c=100;并且在//第四处添加System.out.println(tt.c);
那么运行后,System.out.println(tt.b);带来的结果又变为b=1000;
如果,把//第四处System.out.println(tt.c);放在//第五处的位置上
System.out.println(tt.b);带来的结果又变为b=2000;
m1和m2方法中的sleep方法中的值,也对组后的输出结果有影响。在测试时,偶然发生过,但并不规律。求指点。
人到中年有点甜
呼啦一阵风
相关分类