posts - 241,  comments - 116,  trackbacks - 0
          公告

          <2011年6月>
          2930311234
          567891011
          12131415161718
          19202122232425
          262728293012
          3456789

          常用鏈接

          留言簿(6)

          隨筆分類

          隨筆檔案

          友情鏈接

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          眾所周知hashMap 是線程不安全的,在多線程訪問的情況下,要做同步的處理
          ConcurrentHashMap get() 總能拿到最新的值,類似于關鍵字 volatile保證100%讀取到最新的數據

          如下用代碼說明:

           

          package com.iteye.javaso.demo;

          import java.util.concurrent.ConcurrentHashMap;
          import java.util.concurrent.ExecutorService;
          import java.util.concurrent.Executors;

          public class CopyOfConCurrentHashMapThreadTest2 {

              ConcurrentHashMap<String, String> map = new ConcurrentHashMap<String, String>();

              public static void main(String args[]) {
                  CopyOfConCurrentHashMapThreadTest2 test = new CopyOfConCurrentHashMapThreadTest2();
                  Runnable sleep = new ThreadSleep2(test, "第一條線程");

                  ThreadSecond2 charge2 = new ThreadSecond2(test, "改變值的第2線程");
                  ThreadSecond2 charge3 = new ThreadSecond2(test, "改變值的第3線程");
                  ThreadSecond2 charge4 = new ThreadSecond2(test, "改變值的第4線程");

                  ThreadSecond23 chargeXX = new ThreadSecond23(test, "改變值的XXXX線程");

                  ExecutorService exc = Executors.newFixedThreadPool(5);

                  exc.execute(sleep);

                  exc.execute(charge3);
                  exc.execute(charge2);
                  exc.execute(chargeXX);
                  exc.execute(charge4);
                  exc.shutdown();
                  System.out.println("洗洗睡吧----------------");
                  try {
                      Thread.sleep(16000);
                  } catch (InterruptedException e) {
                      // TODO Auto-generated catch block
                      e.printStackTrace();
                  }
                  System.out.println("多個線程后,最終運行結果:" + test.map.get("firstKey"));
              }

              public  void put(String value, int state) {
                  map.put("firstKey", value);

                  // Thread thread= Thread.currentThread();
                  if (state == 0) {
                      System.out.println("開始睡覺了--------------");
                      try {
                          Thread.sleep(4000);
                          System.out.println("睡醒了-------");
                      } catch (InterruptedException e) {
                          // TODO Auto-generated catch block
                          e.printStackTrace();
                      }

                  }

              }

          }

          class ThreadSleep2 extends Thread {

              ConcurrentHashMap<String, String> map;

              public ThreadSleep2(ConcurrentHashMap<String, String> map, String threadName) {

                  this.map = map;
                  this.name = threadName;
              }

              CopyOfConCurrentHashMapThreadTest2 test;

              public ThreadSleep2(CopyOfConCurrentHashMapThreadTest2 test,
                      String threadName) {

                  super(threadName);
                  this.test = test;
                  this.name = threadName;
              }

              @Override
              public void run() {
                  Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
                  System.out.println("---------------進入第一條線程-----睡十秒先--------");

                  System.out.println("第一條線程未設置前值為:*** " + test.map.get("firstKey"));

                  test.put(name, 0);

                  System.out.println("第一條線程執行完畢  Map中值為:" +test.map.get("firstKey"));

              }

              String name = "";

              public String toString() {

                  return "當前線程的名字是:" + name;
              }

          }

          class ThreadSecond2 extends Thread {

              ConcurrentHashMap<String, String> map;

              public ThreadSecond2(ConcurrentHashMap<String, String> map,
                      String threadName) {
                  super(threadName);
                  this.map = map;
                  this.name = threadName;
              }

              CopyOfConCurrentHashMapThreadTest2 test;

              public ThreadSecond2(CopyOfConCurrentHashMapThreadTest2 test,
                      String threadName) {

                  super(threadName);
                  this.test = test;
                  this.name = threadName;
              }

              @Override
              public void run() {
                  System.out.println("-----------進入其它線程---------");
                  System.out.println("當前線程是:" + this.name + " 未設置map前值為:"
                          + test.map.get("firstKey"));

                  test.put(name, 2);
                  System.out.println("hashMap中 firstKey值為:" + name);
              }

              String name = "";

              public String toString() {

                  return "當前線程的名字是:" + name;
              }
          商賬追收


          }

          class ThreadSecond23 extends Thread {

              ConcurrentHashMap<String, String> map;

              public ThreadSecond23(ConcurrentHashMap<String, String> map,
                      String threadName) {
                  super(threadName);
                  this.map = map;
                  this.name = threadName;
              }

              CopyOfConCurrentHashMapThreadTest2 test;

              public ThreadSecond23(CopyOfConCurrentHashMapThreadTest2 test,
                      String threadName) {

                  super(threadName);
                  this.test = test;
                  this.name = threadName;
              }

              @Override
              public void run() {
                  System.out.println("-----------進入XXXXXXX線程---------");
                  System.out.println("當前線程是:" + Thread.currentThread().getName());
                  try {
                      Thread.sleep(3000);
                  } catch (InterruptedException e) {
                      // TODO Auto-generated catch block
                      e.printStackTrace();
                  }
                  test.put(name, 2);
                  System.out.println("hashMap中 firstKey值為:" + name);
              }

              String name = "";

              public String toString() {

                  return "當前線程的名字是:" + name;
              }

          }
          posted on 2011-06-03 09:28 墻頭草 閱讀(767) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          人人游戲網 軟件開發網 貨運專家
          主站蜘蛛池模板: 锡林浩特市| 南溪县| 咸丰县| 宁国市| 江都市| 台安县| 礼泉县| 利辛县| 万盛区| 丰原市| 阳朔县| 外汇| 新田县| 赤城县| 云霄县| 齐河县| 马关县| 延庆县| 泰州市| 双鸭山市| 台州市| 许昌县| 中牟县| 锡林浩特市| 兴宁市| 喀喇沁旗| 陇西县| 凤山市| 新兴县| 巴林右旗| 黎城县| 百色市| 讷河市| 延安市| 休宁县| 始兴县| 大姚县| 健康| 徐汇区| 辉县市| 平顶山市|