并发编程

Synchronized 修饰类中的静态方法,与非静态方法。

话不多说直接上代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
public class MultiThread{

private static int num=0;

public synchronized void printNum(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();
}
}

public static void main(String[] args){
final MultiThread m1=new MultiThread();
final MultiThread m2=new MultiThread();

Thread t1=new Thread(new Runnable(){
public void run(){
m1.printNum("a");
}
大专栏  并发编程 });

Thread t2=new Thread(new Runnable(){
public void run(){
m2.printNum("b");
}
});

t1.start();
t2.start();
}
}

程序输出的结果:

1
2
3
4
tag a,set num over
tag b,set num over
tagb,num=200
taga,num=200

其实此时程序会出现两种结果的输出:

1
2
3
4
tag b,set num over
tag a,set num over
tagb,num=100
taga,num=100

1
2
3
4
tag b,set num over
tag a,set num over
tagb,num=200
taga,num=200

这是因为int num 被static 修饰,当线程t1和t2的执行顺序不同的时候就会出现这两种结果。此时synchronized是否修饰都不影响程序的执行效果,去掉static 关键字再来观察。

1
2
3
4
tag a,set num over
tag b,set num over
tagb,num=200
taga,num=100

两次输出的结果并不相同,各自输出了各自的预期输出值。线程之间并没有受到干扰。再synchronzied关键字前加上static ,这样便成为了类锁,整个他t1,t2中的printnum方法会存在抢占,会先执行完其一,再执行另一个,看输出结果。

1
2
3
4
tag b,set num over
tagb,num=200
tag a,set num over
taga,num=100
原文地址:https://www.cnblogs.com/lijianming180/p/12286277.html