多线程锁

发布时间 2023-07-26 10:35:15作者: Pearl...T

一、悲观锁和乐观锁

1.1. 一级目录1

1.1.1. 二级目录1

1.1.2. 二级目录1

1.2 八锁案例

1.2.1 说明

  1. 标准访问有ab两个线程,请问是先打印邮件还是短信?
  2. sendEmal方法中加入暂停3秒钟,请问先打印邮件还是短份?
  3. 添加一个普通的heLLo方法,请问先打印邮件还是helLo?
  4. 有两部手机,请问先打印邮件还是短信
  5. 有两个静态同步方法,有部手机,请问先打印邮件还是短信?
  6. 有两个静态同步方法,有2部手机,请问先打印邮件还是短信?
  7. 有1个静态同步方法,有1个普通同步方法,有部手机,请问先打印邮件还是短信?
  8. 一个静态同步方法,有1个普通同步方法,有2部手机,请问先打印邮件还是短信?

1.2.2 分析总结

  • 根据情况1和情况2得出结论:不管暂停3秒还是不暂停都是先打印邮件再打印短信。

一个对象里面如果有多个synchronized方法,某一个时刻内,只要一个线程去调用其中的一个synchronized的方法了,其它的线程都只能等待,换句话说,某一个时刻内,只能有唯一的一个线程去访网这些synchronized方法。锁的是当前对象this,被锁定后,其它的线程都不能进入到当前对象的其它的synchronized方法

public class Lock8Demo {

    public static void main(String[] args)//一切程序的入口
    {
        Phone phone = new Phone();

        new Thread(() -> {
            phone.sendEmail();
        }, "a").start();

        //暂停200毫秒,保证a线程先启动
        try {
            TimeUnit.MILLISECONDS.sleep(200);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        new Thread(() -> {
            phone.sendSMS();
        }, "b").start();
    }
}

class Phone //资源类
{
    public synchronized void sendEmail() {

        // 第二种情况:暂停3秒
        try {
            TimeUnit.SECONDS.sleep(3);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // 打印邮件
        System.out.println("-----sendEmai1");
    }

    public synchronized void sendSMS() {
        // 打印短信
        System.out.println("-----sendsms");
    }

}

1.3 一级目录3

1.3.1 二级目录5

内容5