关键字synchronized与wait( )和notify( )/notityAll( )方法相结合可以实现等待/通知模式,
ReentrantLock类也可以实现相同的功能,使用Condition类可以实现更好的灵活性,比如可以实现多路通知功能,也就是在一个Lock里面可以创建多个Condition(即对象监视器)实例,线程对象可以注册在指定的Condition中,从而可以有选择性地进行线程通知,在调度线程上更加灵活。
在有try/catch/finall语句块中的方法中,lock( )方法常放在try语句块中,unlock( )方法经常放在finally语句块中。
private Condition _save = lock.newCondition();
Object类中的wait( )方法相当于Condition类中的await( )方法。
Object类中的wait(long timeout)方法相当于Condition类中的await(long time,TimeUnit unit)方法。
Object类中的notify( )方法相当于Condition类中的signal( )方法。
Object类中的notifyAll( )方法相当于Condition类中的signalAll( )方法。
公平锁与非公平锁
锁Lock分为“公平锁”和“非公平锁”,公平锁表示线程获取锁的顺序是按照线程加锁的顺序来分配的,即先到先得的FIFO先进先出顺序。而非公平锁就是一种获取锁的抢占机制,是根据线程调度程序的调度随机获得锁。先来的不一定先得到锁,这个方式可能造成某些线程一直拿不到锁,结果也就是不公平的了。
这里需要注意的是:公平锁只能保证线程执行的基本有序,不能保证线程执行的顺序完全按照书写的顺序执行。
ReentrantReadWriteLock类的使用
ReentrantLock类具有完全互斥排他的效果,即同一时间只能有一个线程在执行ReentrantLock.lock( )方法后面的任务。这样做虽然保证了实例变量的线程安全性,但效率确实非常低下的
读写锁多个读锁之间不互斥,读锁与写锁互斥,写锁与写锁互斥。在没有现成Thread进行写入操作时,进行读取操作的多个Thread都可以获取读锁,而进行写入操作的Thread只有在获取写锁后才能进行写入操作。即多个Thread可以同时进行读取操作,但是同一时间只允许一个Thread进行写入操作。
网友评论