今天用LinkedHashMap实现了一个LRUMap,为了保证线程安全,不好好用synchronized,非要装b使用ReentrantReadWriteLock实现。想都没想,一拍脑门,get一把读锁,put一把写锁,挺好的。单线程测试用例通过,一上高并发测试用例,就sb了。
追了下源码,才看到LinkedHashMap的get是有写操作的,只上读锁,头结点一争用不sb才怪。要是逼我get和put上同一把锁。那还不如用synchronizedMap包一下完事儿呢……
后来自己一想,也是,LRU读的时候怎么可能不写点儿东西呢……睡多大脑缺氧了。
结论:装B要小心,失败很惨烈。