多个线程的情况下,每个线程拿到自己的锁后,执行自己的代码段,线程之间互不干扰,下面看看会照成什么样的影响。
代码如下:
分别创建三个线程,给方法加上synchronized关键字,也就是加上一把锁。
package action;
public class Thread02 {
private int num = 0;
public synchronized void getNum(String tag){
if(tag.equals("a")){
System.out.println("tag a,set num over");
}else if(tag.equals("b")){
System.out.println("tag b,set num over");
}else if(tag.equals("c")){
System.out.println("tag c,set num over");
}
System.out.println("tag:"+tag+" num="+num);
}
public static void main(String[] args) {
final Thread02 thread01 = new Thread02();
final Thread02 thread02 = new Thread02();
final Thread02 thread03 = new Thread02();
Thread t1=new Thread(new Runnable() {
@Override
public void run() {
thread01.getNum("a");
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
thread02.getNum("b");
}
});
Thread t3 = new Thread(new Runnable() {
@Override
public void run() {
thread03.getNum("c");
}
});
t1.start();
t2.start();
t3.start();
}
}
结果出乎意料,程序并没有按照预定的顺序执行,运行结果如下:
tag a,set num over
tag b,set num over
tag:b num=0
tag:a num=0
tag c,set num over
tag:c num=0
为什么会照成这种输出结果,因为每个想成都获得一把独立的锁,线程之间互不干扰。
为了让代码按顺序执行,我们在将方法变为静态的static,如下:
private static int num = 0;
public static synchronized void getNum(String tag){
if(tag.equals("a")){
System.out.println("tag a,set num over");
}else if(tag.equals("b")){
System.out.println("tag b,set num over");
}else if(tag.equals("c")){
System.out.println("tag c,set num over");
}
System.out.println("tag:"+tag+" num="+num);
}
运行结果正常
tag a,set num over
tag:a num=0
tag b,set num over
tag:b num=0
tag c,set num over
tag:c num=0
这是为什么呢?加上static表示类级别的锁,独占class文件,在一个线程没有执行完之前,其他县城是不被允许进入代码的。