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

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

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

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

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

 

示例代码:

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 @ 2022-01-11 22:32  陈建江  阅读(167)  评论(0编辑  收藏  举报