Java中对锁的一些理解

本文详细解析Java并发工具包(JUC)中的核心组件,包括Lock接口的各种实现如ReentrantLock、读写锁ReentrantReadWriteLock,以及同步辅助类如CountDownLatch、CyclicBarrier和Semaphore。探讨了这些工具如何解决并发编程中的常见问题,如线程间的同步、等待和通知机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对锁的理解?

一 悲观锁:排它锁(独占锁,互斥锁),公平所,非公平锁,写锁(排它锁)

二 乐观锁:一般基于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,读锁和写锁实现了对同一个对象的访问。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值