package demo;
/*
* 关键字synchronized取得的锁都是对象锁,而不是把一段代码(方法)锁起来;
* 所以代码中哪个线程先执行synchronized关键字的方法,哪个线程就持有该方法所属对象的锁(Lock) new的新的对象就有新的锁;
* 两个对象就有两个锁,互不影响
*
* 再静态方法上synchronized关键字,便是锁定class类,类层级的锁
*
*/publicclass MutiThread {
privatestaticint num = 0;
/*static 让这个方法的锁上升到类层面*/publicstatic synchronized voidprintNum(String tag){
try {
if (tag.equals("a")) {
num = 100;
System.out.println("tag a ,set num over");
Thread.sleep(1000);
} else {
num = 200;
System.out.println("tag b, set num over");
}
System.out.println("tag"+tag+", num: "+num);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//testpublicstaticvoidmain(String[] args) {
final MutiThread m1 = new MutiThread();
final MutiThread m2 = new MutiThread();
//线程1
Thread t1 = new Thread(new Runnable() {
@Override
publicvoidrun() {
m1.printNum("a");
}
});
//线程2
Thread t2 = new Thread(new Runnable() {
@Override
publicvoidrun() {
m2.printNum("b");
}
});
//线程t1,t2开始
t1.start();
t2.start();
//未加static——预期的结果是tag a, set num over, tag a ,num : 100;然后在执行t2,事实不是这样的
}
}
结果:
static synchronized时的结果。
tag a ,set num over
taga, num: 100
tag b, set num over
tagb, num: 200
只有synchronized时的结果。
tag a ,set num over
tag b, set num over
tagb, num: 200
taga, num: 100