我是靠谱客的博主 美满板凳,这篇文章主要介绍java 多线程之Sychronization的三种使用情况,现在分享给大家,希望可以做个参考。

java 多线程之Sychronization的三种使用情况

 1.同步代码块     锁对象可以是任意的对象
 2.普通同步方法 锁对象默认是是 this
 3.静态同步方法 锁对象是当前类的class对象

测试这三种情况下的锁对象 如下:

主类

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package 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
28
package 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
29
package 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
30
package 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内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(62)

评论列表共有 0 条评论

立即
投稿
返回
顶部