架构师之路--线程基础--多个线程多把锁

来源:互联网 发布:知念和凉介抱在一起睡 编辑:程序博客网 时间:2024/06/15 21:49

多个线程的情况下,每个线程拿到自己的锁后,执行自己的代码段,线程之间互不干扰,下面看看会照成什么样的影响。

代码如下:

分别创建三个线程,给方法加上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文件,在一个线程没有执行完之前,其他县城是不被允许进入代码的。



0 0
原创粉丝点击