公平锁、读写锁、信号量、倒计时锁、原子性包

ReentrantLock 公平锁

ReentrantLock lock =new ReentrantLock(true);//创建公平锁 false 竞争锁
lock.lock();//死等
lock.lockInterruptibly();//死等可中断
lock.tryLock();//尝试获取一次锁返回是否成功
lock.tryLock(10,TimeUnit.second);//等10s
lock.unlock();//释放锁
lock.isFair();//查询处于竞争状态
lock.getQueueLength();//等待线程数量
lock.hasQueuedThreads();//是否有等待线程

ReentrantReadWriteLock 读写锁

ReentrantReadWriteLock lock=new ReentrantReadWrite(true);//true公平 false竞争

ReadLock read=lock.readLock();//读锁:共享锁 只有写锁没有被获取时可以多个线程读锁

WriteLock write=lock.writeLock();//独占锁:只有一个线程能获取

Semaphore 信号量

Semaphore s=new Semphore(10,true);//创建10次上限公平信号量
//Semaphore s=new Semphore(5,false);    创建5次上限竞争信号量
s.acquire();//申请1个许可,死等,可中断
s.acquire();//申请3个许可
s.qcquireUninterruptibly(4);//4个许可,不可中断
s.tryAcquire(5);//尝试申请5个许可,立刻反馈
s.tryAcquire(5,10,TimeUnit.SECONDS);//5个许可,最多等10s,可中断
s.release(5);//释放5个许可
s.availablePermits();//查询可用许可数量
s.drainPermits();//查询后把剩下许可都拿走

应用场景:1.资源锁        2.协调线程池        3.协调IO密集型计算密集型任务

CyclicBarrier 循环屏障

CyclicBarrier c=new CyclicBarrier(3);//创建密集量为3的循环栅栏
c=new CyclicBarrier(5,()->{ //到达5后执行的代码});
c.await();//死等
c.await(5,TimeUnit.SECONDS);//超时破坏栅栏,可中断
c.reset();//重置栅栏
c.getParties();//返回聚集量(设定的)
c.isBorken();//是否被破坏
c.gerNumberWaiting();//返回当前线程的聚集量

CountDownLarch 倒计时锁

CountDownLatch cdl=new CountDownLatch(5);
cdl.countDwn();//降低计时数
cdl.await();//等待计数为0,或被中断通过
cdl.await(10,TimeUnit.SECONDS);等待计数为0,或被中断通过,或超时通过
cdl.getCount();//返回当前计时数

循环屏障与倒计时锁比较

1.都是基于计数触发释放锁的机制,都是让多个线程任务等待执行

2.循环屏障是累加计数,倒计时锁是减法归零计数

3.循环屏障的超时等待释放所有线程,倒计时锁释放线程自身

4.循环屏障的等待方法await中绑定计数功能,倒计时锁等待await计数countDown

5.循环屏障可以使用reset复用,倒计时锁不可重复使用

原子性

原子性:提供了互斥访问,同一时刻只能有一个线程来对它进行操作

atomic 原子性包——AtomicInteger        AtomicBoolean        AtomicLong

AtomicInteger atomic =new AtomicInteger(10);//原子性整型变量,初始值为10
atomic.addAndGet(1);//增加1,然后返回变量值
atomic.getAndAdd(1);//返回变量值,然后增加1
atomic.incrementAndGet();//自增然后返回值
atomic.getAndIncrement();//返回值然后自增
atomic.decrementAndGet();//自减然后返回值
atomic.getAnddecrement();//返回值然后自减

atomic 原子性包——AtomicReference

String msg=" ";
AtomicReference<String> atoref=new AtomicReference<String>(msg);
String msg_copy=msg;
if(msg_copy.contains("abc")){
    atoref.compareAndSet(msg_copy,"value");
}

atomic原子性包——AtomicReferenceFieldUpdater

class Demo{public String msg;}
Demo demo =new Demo();
AtomicReferenceFileldUpdater<Demo,String>arfu=AtomicReferenceFileldUpdater.newUpdater(Demo.class,String.class,"msg");
String msg_copy=demo.msg;
if(msg_copy.contains("abc)){
arfu.compareAndSet(demo,msg_copy,"new_value");
}

实力工厂设计思想:将创建对象的权力回收,提供一个静态方法作为创作对象的唯一接口、

public class Demo{
private Demo(){}
public static Demo getDemo(){
    return new Demo();
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值