JUC - Java锁

1.1 公平锁、非公平锁

公平锁:非常公平,不能够插队,必须先来后到。

非公平锁: 非常不公平,可以插队(默认是非公平锁)

代码示例

// 公平锁
public ReentrantLock() {
   
	sync = new NonfairSync();
}
// 非公平锁
public ReentrantLock(boolean fair) {
   
  	sync = fair ? new FairSync() : new NonfairSync();
}

1.2 可重入锁

1.2.1 可重入锁概念

同一线程外层函数获得锁之后,内层递归函数仍然能获取该锁的代码,在同一个线程在外层方法获取锁的时候,在进入内层方法会自动获取锁。线程可以进入任何一个它已经拥有的锁,所同步着的代码块。ReentrantLock、Synchronized 就是一个典型的可重入锁,可重入锁最大的作用就是避免死锁

1.2.2 可重入锁图解

注意: 拿到外面锁1后,里面的锁2, 锁3、可以自动获得。

1.2.3 代码示例

Synchronized版本

package cn.guardwhy.lock;

public class ReentrantLockDemo01 {
   
    public static void main(String[] args) {
   
        // 创建phone对象
        Phone phone = new Phone();

        new Thread(()->{
   
            phone.sendMessage();
        }, "curry").start();
        

        new Thread(()->{
   
            phone.sendMessage();
        }, "kobe").start();
    }
}

// 手机类
class Phone{
   
    public synchronized void sendMessage(){
   

        System.out.println(Thread.currentThread().getName() + "发短信...");
        // 调用call方法
        call();
    }

    public synchronized void call(){
   
        System.out.println(Thread.currentThread().getName() + "打电话...");
    }
}

ReentrantLock版本

package cn.guardwhy
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值