对锁的理解?
一 悲观锁:排它锁(独占锁,互斥锁),公平所,非公平锁,写锁(排它锁)
二 乐观锁:一般基于CAS算法:并发锁,读锁
对JUC包中一些Lock对象以及Lock工具类等对象的理解
一 CountDownLatck
1.是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它能允许一个或多个线程一直等待
2.使用:
1.static CountDownLatch cdLatch=new CountDownLatch(1000);//阀值为1000
2.cdLatch.countDown();
//每次调用CountDownLatch对象
//的countDown方法,对象的的阀值就会减-
3.//阻塞主线程(当CountDownLatch对象的阀值变为0时会解除阻塞)
cdLatch.await();//在哪个线程调用await方法就会阻塞哪个线程。
二 CyclicBarrier
1.CyclicBarrier对象是让一组线程相互等待,所有的执行结束以后,猜继续向后执行
2.CountDownLatch和CyclicBarrier的区别:
(1)CountDownLatch的作用是允许一或多个线程等待其他线程完成执行
(2)CyclicBarrier则是允许N个线程相互等待
(3)CountDownLatch的计数器无法被重置;CyclicBarrier的计数器可以被重置后使用,因此它被成为是循环的barrier
1.//显示让三个线程相互等待,三个线程执行完成之后继续向后执行
static CyclicBarrier cb=new CyclicBarrier(3);
2.cb.await();//执行计数器减的操作
三 Semaphore
1.是一个计数信号量,本质是一个"共享锁"
2.信号量维护了一个信号量许可集,线程通过调用acquire()来获取信号量的许可,当信号量中有可用的许可时,线程能获得该许可;否则线程必须等待,知道有可用的许可为止
3.线程可以通过release()来释放它所持有的信号量许可
1.Semaphore sh = new Semaphore(10, true);
//表示当多个线程同时运行时,定义了只有10个线程获得许可,true表示为公平锁
2.sh.acquire();//获取信号量
3.sh.release();
//释放信号量,不然当10个线程执行完成后,后面的线程拿不到信号量就会阻塞
四 ReentrantLock
1.是一种可重入的互斥锁,又被成为独占锁
2.ReentrantLock锁在同一时间只能被一个线程持有,而重入的意思是ReentrantLock可以被单个线程多次获取
3.ReentrantLock分为"公平锁"和"非公平锁";区别体现在获取锁的机制是否公平.这里的"公平"也不是绝对"公平",而是让一些没有得到锁的线程有机会获得锁,而不会一直等待
1.ReentrantLock lock=new ReentrantLock(true);
//true表示公平锁,默认是非公平锁
2.lock.lock();
3.lock.unlock();
五 Condition
1.是对锁进行更精确的控制(通讯条件)
2.Condition中的await()方法=Object类中的wait()方法
3.Condition中的signal()方法=Object类中的notify()方法
4.Condition中的signalAll()方法=Object类中的notifyAll()方法
5.不同的是Object中的方法要与"Synchronized"捆绑使用
6.而Condition中的方法要与"互斥锁"/"共享锁"捆绑使用
六 LockSupport
是用来创建锁和其他同步类的线程通讯工具的对象
1.LockSupport.park()//阻塞当前线程
2.LockSupport.unpark(thread)//解除阻塞的线程
七 ReadWriteLock接口
1.维护了一堆相关的锁–“读取锁"和"写入锁”,一个用于读取操作,一个用于写入操作
2.“读取锁"用于只读操作,他是"共享锁”,能同时被多个线程获取
3.“写入锁"用于写入操作,它是"独占锁”,写入锁只能被一个吸纳成获取
4.注意:读取锁和写入锁不能同时存在
八 ReentrantReadWriteLock
1.ReentrantReadWriteLock中包含:sync对象,读锁readerLock和写锁writerLock。
2.读锁ReadLock和写锁WriteLock都实现了Lock接口。读锁ReadLock和写锁WriteLock中也都分别包含了"Sync对象",它们的Sync对象和ReentrantReadWriteLock的Sync对象 是一样的,就是通过sync,读锁和写锁实现了对同一个对象的访问。