关于 ReentrantLock和CopyOnWriteArrayList一个疑惑 网上讲到CopyOnWriteArrayList读写分离,看了一下,是写的时候使用了ReentrantLock,读的过程中,新增一个副本;但是在写的过程中还可以进行读,那么这个锁ReentrantLock持有的锁对象(这也是一个疑问?ReentrantLock到底持有的什么)为什么还允许别的进程读???换成Synchronized可不可以?? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 CopyOnWriteArrayList, 读的是副本的值,写的是原始list的值。 ReentrantLock是用来保证写操作是互斥的,可以替换为Synchronized读写的数据不是同一份,所以读的时候是可以写的,只需要写完后,原子的将当前指针指向写入的新数据数组即可。 ReentrantLock 有两点胜过用synchronized1. ReentrantLock 有一个tryLock 方法,如果获得不到锁,会即刻放弃,不会造成死锁2. ReentrantLock 可以跨不同的方法使用,在A方法里加锁,可以在B方法里解锁。需要注意的是,解锁时,调用unlock方法的次数一定要和lock(), tryLock() 的次数一致。如果少了,就会造成死锁,如果多了,就会抛出异常 怎么定位、并截取至倒数第二个指定字符 JTabbedPane中加入JScrollPane的问题 多线程的迷惑 简单Java代码找错 swing中利用dbswing.jar包做字体设置的问题? 调试source not found 线程覆盖,线程中包括了SOCKET的通讯 如何使JTable中的列不可拖动 在Creator 中如何把一个.jar 包引入并能调用EJB里面的方法 为什么Float类可以直接输出数字 对HashMap的疑问 Servelt怎么向ajax传集合?
1. ReentrantLock 有一个tryLock 方法,如果获得不到锁,会即刻放弃,不会造成死锁
2. ReentrantLock 可以跨不同的方法使用,在A方法里加锁,可以在B方法里解锁。需要注意的是,解锁时,调用unlock方法的次数一定要和lock(), tryLock() 的次数一致。
如果少了,就会造成死锁,如果多了,就会抛出异常