网上讲到CopyOnWriteArrayList读写分离,看了一下,是写的时候使用了ReentrantLock,读的过程中,新增一个副本;但是在写的过程中还可以进行读,那么这个锁ReentrantLock持有的锁对象(这也是一个疑问?ReentrantLock到底持有的什么)为什么还允许别的进程读???换成Synchronized可不可以??

解决方案 »

  1.   

    CopyOnWriteArrayList, 读的是副本的值,写的是原始list的值。
      

  2.   

    ReentrantLock是用来保证写操作是互斥的,可以替换为Synchronized读写的数据不是同一份,所以读的时候是可以写的,只需要写完后,原子的将当前指针指向写入的新数据数组即可。
      

  3.   

    ReentrantLock 有两点胜过用synchronized
    1. ReentrantLock 有一个tryLock 方法,如果获得不到锁,会即刻放弃,不会造成死锁
    2. ReentrantLock 可以跨不同的方法使用,在A方法里加锁,可以在B方法里解锁。需要注意的是,解锁时,调用unlock方法的次数一定要和lock(), tryLock() 的次数一致。
    如果少了,就会造成死锁,如果多了,就会抛出异常