java架构《并发线程高级篇四》
本章主要讲并发线程的常见的两种锁。重入锁和读写锁
一:重入锁(ReentrantLock)
概念:重入锁,在需要进行同步的代码加锁,但最后一定不要忘记释放锁,否则会造成锁永远不能释放,其他线程进不了
代码解析:
1 实例化:Lock lock = new ReentrantLock(); 2 3 锁定:lock .lock(); 4 5 释放锁:lock.unlock();
代码:
1 private Lock lock = new ReentrantLock(); 2 3 public void method1(){ 4 try { 5 lock.lock(); 6 System.out.println("当前线程:" + Thread.currentThread().getName() + "进入method1.."); 7 Thread.sleep(1000); 8 System.out.println("当前线程:" + Thread.currentThread().getName() + "退出method1.."); 9 Thread.sleep(1000); 10 } catch (InterruptedException e) { 11 e.printStackTrace(); 12 } finally { 13 14 lock.unlock(); 15 } 16 }
Condition类:配合重入锁,阻塞和通知,不需要配合synchronized使用,比较灵活,支持多个线程锁定,同时通知全部。
阻塞和通知:
1 private Lock lock = new ReentrantLock(); 2 3 private Condition condition = lock.newCondition();
阻塞:condition.await();
通知:condition.signal();
通知全部:condition.signalall()
Lock/Condition其他方法和用法:
Lock lock=new ReentrantLock(boolean isFair); tryLock():尝试获得锁,返回false/true tryLock():在给定的时间内尝试获得锁,获得结果用 true/false表示。 isFair():返回是否是公平锁 true/false isLocked():返回是否锁定 getHoldCount():返回当前线程保持此锁的个数,或者说表示调用了lock()的次数 lockinterruptibly():优先响应中断的锁 getQueueLength():返回正在等待获取此锁定的线程数。 getWaitQueueLength():返回等待与锁定相关的给定条件Condition的线程数 hasQueueThread(Thread t):查询指定的线程是否正在等待此锁 hasQueueThreads():查询是否有线程正在等待此锁 hasWaiters():查询是否有线程正在等待与此锁定有关的condition条件
二:读写锁(ReentrantReadWriteLock)
概念:其核心就是读写分离的锁,在读多写少情况下,性能远高于重入锁 。口诀:读读共享,写写互斥,读写互斥
代码解析:
实例化:
private ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock(); private ReadLock readLock = rwLock.readLock(); //获取到读锁 private WriteLock writeLock = rwLock.writeLock(); //获取到写锁