JUC练习4——理解synchronized锁的对象

1,普通方法synchronized锁的是当前对象:

2,静态的synchronized方法锁的当前类对象

3,哪个线程先获取到锁,它就先执行。

4,类对象锁不会比普通对象锁先执行。

 

示例代码:

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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
import java.util.concurrent.TimeUnit;
 
public class JucTest2
{
    public static void main(String[] args) throws InterruptedException {
        Phone phone = new Phone();
        Phone phone1 = new Phone();
 
        new Thread(()->{phone.sendMsg();},"A").start();//拿到phone锁后,等待4秒,打印发短信
        TimeUnit.SECONDS.sleep(1);//保证发短信方法先拿到phone对象锁
        new Thread(()->{phone.call();},"B").start();//call()需要获取到phone锁,由于phone锁被sendMsg()占用所以需要等待它释放锁
        new Thread(()->{phone1.call();},"B1").start();//直接拿到phone1锁,打印phone1打电话
        new Thread(()->{phone.playGame();},"C").start();//普通方法没有锁直接执行,打印玩游戏
 
        new Thread(()->{phone.QQ();},"D").start();//静态的synchronized方法锁的当前类对象,他先获取的锁所以先执行
        new Thread(()->{phone1.WeChat();},"E").start();//由于没有拿到锁,所以需要等待QQ()方法执行完毕释放锁后,获取锁执行
    }
}
 
class Phone
{
     synchronized void sendMsg() {
        try {
            TimeUnit.SECONDS.sleep(4);//睡眠4秒,call方法正在等待sendMsg方法执行完毕,释放锁
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName()+"发短信");
    }
 
    synchronized void call()
    {
        System.out.println(Thread.currentThread().getName()+"打电话");
    }
 
    void playGame()
    {
        System.out.println(Thread.currentThread().getName()+"玩游戏");
    }
 
    static synchronized void QQ()
    {
        try {
            TimeUnit.SECONDS.sleep(4);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName()+"玩QQ");
    }
 
    static synchronized void WeChat()
    {
        System.out.println(Thread.currentThread().getName()+"玩微信");
    }
}

  

 

posted @   陈建江  阅读(171)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示