ÉèΪÊ×Ò³ ¼ÓÈëÊÕ²Ø

TOP

ReentrantReadWriteLock¶ÁÐ´ËøµÄʹÓÃ2(Ò»)
2015-07-20 17:23:50 À´Ô´: ×÷Õß: ¡¾´ó ÖРС¡¿ ä¯ÀÀ:5´Î
Tags£ºReentrantReadWriteLock ¶Áд ʹÓÃ

±¾ÎÄ¿É×÷Ϊ´«Ö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();
Ê×Ò³ ÉÏÒ»Ò³ 1 2 ÏÂÒ»Ò³ βҳ 1/2/2
¡¾´ó ÖРС¡¿¡¾´òÓ¡¡¿ ¡¾·±Ìå¡¿¡¾Í¶¸å¡¿¡¾Êղء¿ ¡¾ÍƼö¡¿¡¾¾Ù±¨¡¿¡¾ÆÀÂÛ¡¿ ¡¾¹Ø±Õ¡¿ ¡¾·µ»Ø¶¥²¿¡¿
·ÖÏíµ½: 
ÉÏһƪ£ºHDU 4704 Sum (¸ô°åÔ­Àí + ·ÑÂíС.. ÏÂһƪ£ºPOJ 2411Mondriaan's Dream

ÆÀÂÛ

ÕÊ¡¡¡¡ºÅ: ÃÜÂë: (ÐÂÓû§×¢²á)
Ñé Ö¤ Âë:
±í¡¡¡¡Çé:
ÄÚ¡¡¡¡ÈÝ:

¡¤Spring Boot Java£º (2025-12-26 16:20:19)
¡¤Spring Boot¤ÇHello (2025-12-26 16:20:15)
¡¤Spring ¤Î»ù±¾¤«¤éŒ (2025-12-26 16:20:12)
¡¤C++Ä£°å (template) (2025-12-26 15:49:49)
¡¤C ÓïÑÔÖÐÄ£°åµÄ¼¸ÖÖ (2025-12-26 15:49:47)