Lock以及synchronized锁

class Phone{
    public static synchronized  void sendEmail() throws Exception{
        Thread.sleep(4000);
        System.out.println("-------------sendEmail");
    }
    public  synchronized  void sendSMS() throws Exception{
        System.out.println("-------------sendSMS");
    }

    public void hello(){
        System.out.println("hello");
    }
}

synchronized锁一般作用与防止多个线程共享资源类里的变量而用的锁。

*多线程8锁
1 标准访问,请问先打印邮件还是短信?邮件
2.邮件方法暂停4秒钟,请问先打印邮件还是短信?邮件
3.新增一个普通方法hello() ,请问先打印邮件还是hello?hello(普通方法)
4.两部手机,请问先打印邮件还是短信?短信(两部手机,则锁不同,分别位两个实现类的锁)
5.两个静态同步方法,统一部手机,请问先打印邮件还是短信?邮件(静态类,则锁作用在类上,无论几个手机都是先邮件)
6.两个静态同步方法,两部手机,请问先打印邮件还是短信?邮件(同上)
7.一个普通同步方法,一个静态同步方法,1部手机,请问先打印邮件还是短信?(短信,普通同步方法不抢静态类的锁)
8.一个普通同步方法,一个静态同步方法,2部手机,请问先打印邮件还是短信?短信 *

以上是根据以上资源类,同时用两个线程进行操作资源类中的函数,其中发邮件沉睡4s,看发短信是会等待4s后再进行还是直接进行。

首先创建两个手机

Phone phone = new Phone();
Phone phone2 = new Phone();

然后创建两个线程分别执行资源类中的方法,其中一个沉睡四秒

new Thread(() -> {
            try {
                phone.sendEmail();
            } catch (Exception e) {
                e.printStackTrace();
            }
        },"A").start();
        Thread.sleep(100);

        new Thread(() -> {
            try {
                //phone.sendSMS();
//                phone.hello();
                phone.sendSMS();
            } catch (Exception e) {
                e.printStackTrace();
            }
        },"B").start();

Lock锁

Lock锁的创建

private Lock lock = new ReentrantLock();
private Condition condition = lock.newCondition();

与synchronized的对比

Lock

public void increase() throws InterruptedException{
    lock.lock();
    try{
        while (number!=0){
        condition.await();
    }
    number++;
    System.out.println(Thread.currentThread().getName()+"\t"+number);
    condition.signalAll();
    }catch (Exception e){
        e.printStackTrace();
    }finally{
        lock.unlock();
    }
}

synchronized

public synchronized void  increase() throws InterruptedException {
    while (number!=0){
        this.wait();
    }
    number++;
    System.out.println(Thread.currentThread().getName()+"\t"+number);
    this.notifyAll();
}

synchronized由lock.lock(),lock.unlock()代替
this.wait() 变为 condition.await(),this.notifyAll() 变为 conditon.signalAll()

notifyAll()以及signalAll()为唤醒所有线程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值