java 多线程之Sychronization的三种使用情况
1.同步代码块 锁对象可以是任意的对象
2.普通同步方法 锁对象默认是是 this
3.静态同步方法 锁对象是当前类的class对象
测试这三种情况下的锁对象 如下:
主类
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16package Sychronization; /** * 测试类 * @author feige */ public class SychronizationDemo { public static void main(String[] args) { MyRunnable mr=new MyRunnable(); Thread th1=new Thread(mr,"阿飞"); Thread th2=new Thread(mr,"阿瑞"); Thread th3=new Thread(mr,"靳杨"); th1.start(); th2.start(); th3.start(); } }
同步代码块的MyRunnable类 :
复制代码
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
28package Sychronization; public class MyRunnable implements Runnable { //定义全局变量 private static int ticket=1000; private Object obj=new Object(); private int x=1; @Override public void run() { while(true){ if(x%2==0){ synchronized(obj){//obj 同步锁必须锁住的是同一个对象 if(ticket>0){ x++; System.out.println(Thread.currentThread().getName()+":"+ticket--); } } } else{ synchronized(obj){//obj 同步锁必须锁住的是同一个对象 if(ticket>0){ x++; System.out.println(Thread.currentThread().getName()+":"+ticket--); } } } } } }
普通同步方法的MyRunnable类 :
复制代码
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
29package Sychronization; public class MyRunnable implements Runnable { //定义全局变量 private static int ticket=1000; private Object obj=new Object(); private int x=1; @Override public void run() { while(true){ if(x%2==0){ synchronized(this){ if(ticket>0){ x++; System.out.println(Thread.currentThread().getName()+":"+ticket--); } } } else{ show(); } } } public synchronized void show(){ if(ticket>0){ x++; System.out.println(Thread.currentThread().getName()+":"+ticket--); } } }
静态同步方法的MyRunnable类 :
复制代码
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
30package Sychronization; public class MyRunnable implements Runnable { //定义全局变量 private static int ticket=1000; private Object obj=new Object(); private static int x=1; @Override public void run() { while(true){ if(x%2==0){ synchronized(MyRunnable.class){ if(ticket>0){ x++; System.out.println(Thread.currentThread().getName()+":"+ticket--); } } } else{ show(); } } } public static synchronized void show(){ if(ticket>0){ x++; System.out.println(Thread.currentThread().getName()+":"+ticket--); } } }
最后
以上就是美满板凳最近收集整理的关于java 多线程之Sychronization的三种使用情况的全部内容,更多相关java内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复