Java多线程编程核心技术(第四章Lock的使用)

1.JDK1.5中新增了ReentrantLock类,可以跟synchronized关键字一样来实现线程之间的同步互斥,但在扩展功能上也更加强大,比如具有嗅探锁定、多路分支通知等功能,而且也要比synchronize更加灵活。
2.大致用法:private Lock = new ReentrantLock() lock.lock()/锁定的代码块/lock.unlock().
3.调用lock.lock的线程也持有“对象监视器”,其他线程只有等待锁释放时再次争抢。
4.Condition:在一个Lock对象里面可以创建多个Condition(即对象监视器)实例,线程对象可以注册在制定的Condition里面,从而可以有选择性地进行线程通知,在调度线程上更加灵活。synchronize就相当于整个Lock对象中只有一个单一的Condition对象,所有的线程都注册在它一个对象身上。
使用方法:Condition condition = lock.newCondition();在使用condition.await()方法时一定要放到lock.lock里面,否则会报java.lang.IllegalMonitorStateException异常。(无监视器对象)condition.await()方法是使线程进入了等待状态。
5.Object类中的wait方法就相当于Condition里面的await方法,notify方法相当于signal方法,notifyAll相当于signalAll方法。
6.公平锁与非公平锁:公平锁表示线程获获取锁的顺序是按照线程加锁的顺序来分配的,而非公平锁就是一种获取锁的抢先机制,是随机获得锁的。使用:ReentrantLock lock = new ReentrantLock(boolean);
7.lock.getHoldCount()方法:查询当前线程保持此锁定的个数,也就是调用lock()方法的次数。
8.lock.getEueueLength()方法:返回正等待获取此锁定的线程的数量。
9.lock.getWaitQueueLength(Condition condition)的作用是返回等待与此锁定相关的给定条件Condition的线程估计数。
10.lock.hasQueuedThread(Thread thread)查询指定的线程是否正在等待获取此锁定。
11.lock.hasQueuedThreads()的作用是查询是否有线程正在等待获取此锁定。
12.lock.hasWaiters(Condition condition)的作用是查询是否有线程正在等待与此锁定有关的condition条件。
13.lock.isFair()判断是不是公平锁,默认情况下是非公平锁。
14.lock.isHeldByCurrentThread()查询当前线程是否保持锁定。
15.lock.isLocked()查询此锁定是否由任意线程保持。
16.lock.lockInterruptibly():如果当前线程未被中断,则获取锁定,如果已经中断则抛出异常(try、catch异常,InterruptedException异常)。
17.lock.tryLock():调用线程时当前锁定未被其他线程锁定,才获取该锁定。
18.lock.tryLock(long timeout,TimeUnit unit):如果锁定在给定等待时间内没有被另外一个线程保持且当前线程未被中断,则获得该锁定(如果未锁定则进入锁定状态而不是等待时间超出再锁定)。
19.codition.awaitUninterruptibly()使用这个再使用interrupt标记线程结束时不会报错,await会报错。
20.condition.awaitUntil(calendarRef.getTime()),在这个时间范围内会被唤醒或者等待其他线程唤醒此线程。
21.ReentrantReadWriteLock:读写锁,使用它比ReentrantLock要快,读写锁有两个锁,一个是读操作的相关锁,叫共享锁,写相关的锁叫排它锁。写锁与写锁和读锁互斥,读锁和读锁不互斥。
private ReentrantReadWritelock lock = new ReentrantReadWrireLock();
读锁:lock.readLock().lock 解锁: lock.readLock().unlock();
写锁:lock.writeLock().lock 解锁: lock.writeLock().unlock();

你可能感兴趣的:(java,编程,多线程,线程,多线程编程)