Java多线程系列(十九)一些锁的概念

1.可重入锁与不可重入锁

per-thread  同一个thread中,获取锁之后再次使用同样的方法或者对象中的其他方法可以直接操作,

而不需要重新获取锁。 它是基于thread粒度的,per-thread

举例:

// 可重入锁
public class Lock{
    boolean isLocked = false;
    Thread  lockedBy = null;
    int lockedCount = 0;
    public synchronized void lock()
            throws InterruptedException{
        Thread thread = Thread.currentThread();
        while(isLocked && lockedBy != thread){
            wait();
        }
        isLocked = true;
        lockedCount++;
        lockedBy = thread;
    }
    public synchronized void unlock(){
        if(Thread.currentThread() == this.lockedBy){
            lockedCount--;
            if(lockedCount == 0){
                isLocked = false;
                notify();
            }
        }
    }
}

 

不可重入锁

每次使用锁方法时,都需要重新获取锁,即使在同一线程找那个调用同一方法都需要等待上一个锁的释放

基于method粒度,per-invocation

举例:

// 不可重入锁
public class Count{
    Lock lock = new Lock();
    public void print(){
        lock.lock();
        doAdd();
        lock.unlock();
    }
    public void doAdd(){
        lock.lock();
        //do something
        lock.unlock();
    }
}

2.公平锁与非公平锁

以请求锁的顺序来获取锁

比如同时有多个线程在等待一个锁,当这个锁被释放时,等待时间最久的线程(最先请求的线程)会获得该锁,这种就是公平锁。

synchronized是非公平锁,ReentrantLock 和 ReentrantReadWriteLock可以设置为公平锁

 

3.可中断锁与不可中断锁

synchronized就是不可中断锁,Lock是可中断锁

如果某一线程A正在执行锁中的代码,另一线程B正在等待获取该锁,可能由于等待时间过长,线程B不想等待了,

想先处理其他事情,我们可以让它中断自己或在别的线程中中断它,这种就是可中断锁。

 

4.读写锁

本质是分成两个锁,读锁,写锁。

在读锁下,多个线程可以并发的进行访问,但是在写锁的时候

只能一个个顺序访问。

读读共享、写写互斥、读写 互斥

 

5.自旋锁

与互斥锁相似。与普通锁不同的是,一个线程A在获得普通锁后,如果再有线程B视图获取锁,那么这个线程B将会挂起()()(阻塞);

试想下,如果两个线程资源竞争不是特别激烈,而处理器阻塞一个线程引起的线程上下文的切换的代价高于等待资源的代价的时候(锁的已保持者保持锁时间比较短),那么线程B可以不放弃CPU时间片,而是在“原地”忙等,直到锁的持有者释放了该锁,这就是自旋锁的原理,可见自旋锁是一种非阻塞锁。

问题:(1)过多占据CPU时间

           (2)死锁问题

 

6 独享锁 vs 共享锁

独享锁:指该锁一次只能被一个线程持有。

共享锁:  该锁可悲多个线程锁持有

 

ReentrantLock :独享锁
ReentrantReadWriteLock: 读锁是共享锁,写锁是独享锁

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值