当前位置:操作系统 > Unix/Linux >>

实战Memcached缓存系统(6)Memcached CAS的多线程程序实例

1. 源程序
[java]
package com.sinosuperman.memcached; 
 
import java.io.IOException; 
import java.net.InetSocketAddress; 
 
import net.spy.memcached.CASResponse; 
import net.spy.memcached.CASValue; 
import net.spy.memcached.MemcachedClient; 
 
 
public class Test { 
     
    private static MemcachedClient client = null; 
     
    static { 
        try { 
            client = new MemcachedClient(new InetSocketAddress("localhost", 11211)); 
        } catch (IOException o) { 
        } 
    } 
 
    public static void main(String[] args) throws Exception { 
         
        client.set("numberss", 1800, 1); 
         
        Test testObj = new Test(); 
        for (int i = 0; i < 10; i++) { 
            testObj.new ThreadTest("Thread-" + (i + 1)).start(); 
        } 
    } 
     
    private class ThreadTest extends Thread { 
         
        private  MemcachedClient client = null; 
        ThreadTest(String name) throws IOException { 
            super(name); 
            client = new MemcachedClient(new InetSocketAddress("localhost", 11211)); 
        } 
         
        public void run() { 
            int i = 0; 
            int success = 0; 
            while (i < 10) { 
                i++; 
                CASValue<Object> uniqueValue =client.gets("numberss"); 
                CASResponse response = client.cas("numberss",    
                 uniqueValue.getCas(), (Integer)uniqueValue.getValue() + 1); 
 
                if (response.toString().equals("OK")) { 
                    success++; 
                } 
                 
                if (i == 10) 
                System.out.println(Thread.currentThread().getName() + " " +  i  
                  + " time " + " update oldValue : " + uniqueValue.getValue()  
                  +  " , result : " + response); 
            } 
             
            if (success < 10) { 
                Count.incr(10 - success); 
                System.out.println("Test counter: " + Count.get());  
            } 
        } 
    } 
     
    public static class Count { 
        private static int counter = 0; 
        public static void incr(int x) { 
            counter += x; 
        } 
        public static int get() { 
            return counter; 
        } 
    } 

 
2. 输出结果:
[plain]
Thread-1 10 time  update oldValue : 14 , result : EXISTS 
Test counter: 6 
Thread-2 10 time  update oldValue : 14 , result : EXISTS 
Test counter: 15 
Thread-3 10 time  update oldValue : 17 , result : EXISTS 
Test counter: 22 
Thread-5 10 time  update oldValue : 17 , result : EXISTS 
Test counter: 27 
Thread-4 10 time  update oldValue : 20 , result : OK 
Test counter: 33 
Thread-8 10 time  update oldValue : 27 , result : OK 
Test counter: 36 
Thread-6 10 time  update oldValue : 28 , result : EXISTS 
Test counter: 43 
Thread-10 10 time  update oldValue : 31 , result : EXISTS 
Test counter: 52 
Thread-9 10 time  update oldValue : 31 , result : OK 
Test counter: 60 
Thread-7 10 time  update oldValue : 35 , result : OK 
Test counter: 65 
 
3. 分析
我们可以看到,未成功的次数最终为65,数据值最终为35,两者的和刚好是100,正好符合我们的实验结果预期
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,