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();
}
}