posts - 241,  comments - 116,  trackbacks - 0
          眾所周知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)  編輯  收藏

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


          網站導航:
           
          人人游戲網 軟件開發網 貨運專家
          主站蜘蛛池模板: 武乡县| 龙门县| 喜德县| 遂宁市| 屏边| 文山县| 德阳市| 永年县| 桐柏县| 正宁县| 铜鼓县| 岢岚县| 醴陵市| 肃北| 阿合奇县| 中山市| 安龙县| 周至县| 裕民县| 长春市| 无锡市| 青阳县| 乐陵市| 樟树市| 宁海县| 柳林县| 和平区| 榆林市| 鲜城| 巴楚县| 偃师市| 鄂温| 永修县| 潞城市| 东莞市| 河津市| 平舆县| 绥阳县| 青海省| 永春县| 南阳市|