±¾ÎÄ¿É×÷Ϊ´«ÖDz¥¿Í¡¶ÕÅТÏé-Java¶àÏß³ÌÓë²¢·¢¿â¸ß¼¶Ó¦Óá·µÄѧϰ±Ê¼Ç¡£
ÕâÒ»½ÚÎÒÃÇ×öÒ»¸ö»º´æÏµÍ³¡£
ÔÚ¶Á±¾½Úǰ
ÇëÏÈÔĶÁ
ReentrantReadWriteLock¶ÁÐ´ËøµÄʹÓÃ1
µÚÒ»°æ
public class CacheDemo {
private Map
cache = new HashMap
(); public static void main(String[] args) { CacheDemo cd = new CacheDemo(); System.out.println(ss +cd.getData2(ss)); System.out.println(ss +cd.getData2(ss)); System.out.println(mm +cd.getData2(mm)); System.out.println(mm +cd.getData2(mm)); } public Object getData2(String key){ Object o=cache.get(key); if (o==null) { //±êʶ1 System.out.println(µÚÒ»´Î²é ûÓÐ+key); o=Math.random(); //ʵ¼ÊÉÏ´Ó
Êý¾Ý¿âÖлñµÃ cache.put(key, o); } return o; } }
ÔËÐнá¹û:
µÚÒ»´Î²é ûÓÐss
ss 0.4045014284225158
ss 0.4045014284225158
µÚÒ»´Î²é ûÓÐmm
mm 0.9994663041529088
mm 0.9994663041529088
ËÆºõûÓÐÎÊÌâ¡£
Äã¾õµÃÄØ?
Èç¹ûÓÐÈý¸öÏß³ÌͬʱµÚÒ»´Îµ½ÁËgetData2()µÄ±êʶ1´¦(Ëù²éÕÒµÄkeyÒ²¶¼Ò»Ñù),Ò»¼ì²éoΪnull,È»ºó¾ÍÈ¥²éÊý¾Ý¿â¡£ÔÚÕâÖÖÇé¿öÏÂ,¾ÍµÈÓÚÈý¸öÏ̲߳éͬһ¸ökey,È»ºó¶¼È¥ÁËÊý¾Ý¿â¡£
ÕâÏÔÈ»ÊDz»ºÏÀíµÄ¡£
µÚ¶þ°æ synchronized
×î¼òµ¥µÄ°ì·¨
public synchronized Object getData2(String key){
//.....
}
?
µÚÈý°æ Ëø
ÉÏÒ»½ÚÎÒÃÇÌáµ½ÁËReentrantLock¿ÉÒÔÌæ»»synchronized,ǰÕßÊÇÒ»ÖÖ¸üÎªÃæÏò¶ÔÏóµÄÉè¼Æ¡£ÄÇÎÒÃÇÊÔÊÔ¡£
private Lock l=new ReentrantLock(); //l×÷ΪCacheDemoµÄ³ÉÔ±±äÁ¿
public Object getData3(String key) {
l.lock();
Object o=null;
try {
o = cache.get(key);
if (o == null) { // ±êʶ1
System.out.println(µÚÒ»´Î²é ûÓÐ + key);
o = Math.random(); // ʵ¼ÊÉÏ´ÓÊý¾Ý¿âÖлñµÃ
cache.put(key, o);
}
} finally {
l.unlock();
}
return o;
} µÚÈý°æ¿ÉÒÔÂð?
¿ÉÒÔ¸öp¡£
Ϊʲô,×Ô¼ºÏë¡£
?
ÎÒÃǵÃʹÓÃReentrantReadWriteLock,ÔÚͬһ¸ö·½·¨ÖмÈÓжÁËøÒ²ÓÐÐ´Ëø¡£
Ê×ÏÈÎÒÓÖÒ»¸öÎÊÌâ:
¶Ôͬһ¸öÏß³Ì,¿ÉÒÔÔÚ¼ÓÁ˶ÁËøºó,ûÓн⿪¶ÁËøÇ°,ÔÙ¼ÓÐ´ËøÂð?
»»¾ä»°Ëµ,ÏÂÃæµÄ´úÂë»áÍ£Âð?
public class CacheDemo {
private Map
cache = new HashMap
(); private ReadWriteLock rwl = new ReentrantReadWriteLock(); public static void main(String[] args) { CacheDemo cd = new CacheDemo(); cd.getData2(); } public void getData2(){ rwl.readLock().lock(); System.out.println(1); rwl.writeLock().lock(); System.out.println(2); rwl.readLock().unlock(); System.out.println(3); rwl.writeLock().unlock(); System.out.println(4); } }
Ç××ÔÊÔÒ»ÏÂ,¿ØÖÆÌ¨Êä³ö1ºó,³ÌÐò¾Í²»¶¯ÁË¡£
˵Ã÷¼ÓÐ´ËøÇ°,¶ÁËøµÃÏȽ⿪¡£
µÚËİæ
¼´ÓжÁËø,ÓÖÓÐÐ´Ëø
public static void main(String[] args) {
CacheDemo cd = new CacheDemo();
System.out.println(ss +cd.getData4(ss));
System.out.println(ss +cd.getData4(ss));
System.out.println(mm +cd.getData4(mm));
System.out.println(mm +cd.getData4(mm));
}
public Object getData4(String key){
rwl.readLock().lock();
Object o=null;
try {
o=cache.get(key);
if (o==null) {
System.out.println(µÚÒ»´Î²é ûÓÐ+key);
rwl.readLock().unlock(); //±êʶ4
rwl.writeLock().lock();
try {
if(value==null){ //±êʶ0
value = aaaa;//ʵ¼Êµ÷Óà queryDB();
cache.put(key,value);
}
} finally {
rwl.writeLock().unlock();
}
rwl.readLock().lock(); //±êʶ1
}
}finally {
rwl.readLock().unlock(); //±ê×¢2
}
return o;
} ½á¹û
µÚÒ»´Î²é ûÓÐss
ss 0.5989899889645358
ss 0.5989899889645358
µÚÒ»´Î²é ûÓÐmm
mm 0.8534424949014686
mm 0.8534424949014686
Õâ¸ö»¹ÓÐÈý¸öÎÊÌâ
1ΪʲôÔÚ±êʶ2´¦»¹µÃ½âËø¡£
Õâ¸ö´ð°¸ÔÚÉÏÒ»½ÚÒѾÌá¹ý¡£
2ΪʲôÔÚ±êʶ1³ö»¹µÃ¼ÓËø?
Èç¹û±êʶ1´¦²»¼ÓËø,ÇÒ³ÌÐòÒ»Ö±Õý³£Ö´ÐÐ,ÄÇôµ½±êʶ2´¦,Ëü½â˵ÄËø?
3Ϊʲô±êʶ0³ö»¹Òª¼ì²éÒ»´Î?
Èç¹ûͬʱÓÖÈý¸öÏß³ÌÔËÐе½±êʶ4(²éÕÒÏàͬµÄkey),ÆäÖÐÒ»¸ö»ñµÃÐ´Ëø,дÈëÊý¾Ýºó,ÊÍ·ÅÁËÐ´Ëø¡£´ËʱÁíÍâÁ½¸öÏ̻߳¹ÐèҪȥÊý¾Ý¿âÅÜÒ»ÌËô?
ÁíÍâ°Ñ±êʶ1´¦µÄ¼Ó¶ÁËø,·Åµ½finallyµÄÇ°Ãæ³ÆÖ®Îª½µ¼¶Ëø¡£¶Ô½µ¼¶Ëø,ÎÒĿǰҲ²»Ì«Çå³þ¡£
¹Ù·½ÎĵµÖиøÁËÒ»¸öÀý×Ó¾ÍÊǹØÓÚ½µ¼¶Ëø,ÈçÏÂ
class CachedData {
Object data;
volatile boolean cacheva lid;
final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
void processCachedData() {
rwl.readLock().lock();
if (!cacheva lid) {
// Must release read lock before acquiring write lock
rwl.readLock().unlock();
rwl.writeLock().lock();