concurrenthashmap的同步代码块(缓存是ConcurrentHashMap怎么做给个例子)

ConcurrentHashMap:马克- to-win:马克 java社区:防盗版实名手机尾号: 73203马克-to-win:ConcurrentHashMap是java1.5的新特性HashTable在并发环境下效率低的原因: HashTable就一把锁,所有线程竞争ConcurrentHashMap里面有很多锁,就像数据库里的行级锁一样改这行,锁这行,不影响别的行最重要的是:一个线程添加(put)元素,同时另一个线程读数据不会引起ConcurrentModificationException异常读写可以同时进行,只不过读的有可能不是最新数据马克-to-win:所以如果需要原子操作时,还得手动加锁所以我们前面学的锁的理论,照样适用(见下面的例子)例 2.2.2.1package com;import java.util.*;import java.util.concurrent.ConcurrentHashMap;class MulThreMarkToWin extends Thread { Map map; public MulThreMarkToWin(Map map) { this.map = map; } public void run() { for (int i = 1; i <= 30; i ) {(购买完整教程) System.out.println("第一个线程要睡觉"); try { Thread.sleep(3); System.out.println("第一个线程刚睡完"); } catch (InterruptedException e) { e.printStackTrace(); } } }}class MulThreMarkToWinInsert extends Thread { Map map; public MulThreMarkToWinInsert(Map map) { this.map = map; } public void run() { for (int i = 1; i <= 30; i ) { map.put("kkk" i, "vvv" i); System.out.println("添加了一对 " i); System.out.println("第二个线程要睡觉觉睡得短,所以很两个线程执行顺序完全不可控,不睡觉就不能混着执行了"); try { Thread.sleep(3); System.out.println("第二个线程刚睡完"); } catch (InterruptedException e) { e.printStackTrace(); } } }}public class TestConcurBuy_MarkToWin { public static void main(String[] args) { Map map = new ConcurrentHashMap();/*下面三种集合都会报ConcurrentModificationException异常*/// Map map = Collections.synchronizedMap(new HashMap());// Map map = new HashMap();// Map map = new Hashtable(); Thread t1 = new MulThreMarkToWin(map); Thread t2 = new MulThreMarkToWinInsert(map); t1.start(); t2.start(); }},接下来我们就来聊聊关于concurrenthashmap的同步代码块?以下内容大家不妨参考一二希望能帮到您!

concurrenthashmap的同步代码块(缓存是ConcurrentHashMap怎么做给个例子)

concurrenthashmap的同步代码块

ConcurrentHashMap:马克- to-win:马克 java社区:防盗版实名手机尾号: 73203。马克-to-win:ConcurrentHashMap是java1.5的新特性。HashTable在并发环境下效率低的原因: HashTable就一把锁,所有线程竞争。ConcurrentHashMap里面有很多锁,就像数据库里的行级锁一样。改这行,锁这行,不影响别的行。最重要的是:一个线程添加(put)元素,同时另一个线程读数据不会引起ConcurrentModificationException异常。读写可以同时进行,只不过读的有可能不是最新数据。马克-to-win:所以如果需要原子操作时,还得手动加锁。所以我们前面学的锁的理论,照样适用。(见下面的例子)例 2.2.2.1package com;import java.util.*;import java.util.concurrent.ConcurrentHashMap;class MulThreMarkToWin extends Thread { Map map; public MulThreMarkToWin(Map map) { this.map = map; } public void run() { for (int i = 1; i <= 30; i ) {(购买完整教程) System.out.println("第一个线程要睡觉"); try { Thread.sleep(3); System.out.println("第一个线程刚睡完"); } catch (InterruptedException e) { e.printStackTrace(); } } }}class MulThreMarkToWinInsert extends Thread { Map map; public MulThreMarkToWinInsert(Map map) { this.map = map; } public void run() { for (int i = 1; i <= 30; i ) { map.put("kkk" i, "vvv" i); System.out.println("添加了一对 " i); System.out.println("第二个线程要睡觉觉睡得短,所以很两个线程执行顺序完全不可控,不睡觉就不能混着执行了"); try { Thread.sleep(3); System.out.println("第二个线程刚睡完"); } catch (InterruptedException e) { e.printStackTrace(); } } }}public class TestConcurBuy_MarkToWin { public static void main(String[] args) { Map map = new ConcurrentHashMap();/*下面三种集合都会报ConcurrentModificationException异常*/// Map map = Collections.synchronizedMap(new HashMap());// Map map = new HashMap();// Map map = new Hashtable(); Thread t1 = new MulThreMarkToWin(map); Thread t2 = new MulThreMarkToWinInsert(map); t1.start(); t2.start(); }}

输出结果:添加了一对 1第二个线程要睡觉觉睡得短,所以很两个线程执行顺序完全不可控,不睡觉就不能混着执行了循环第1次,mapSize is 1第二个线程刚睡完添加了一对 2第二个线程要睡觉觉睡得短,所以很两个线程执行顺序完全不可控,不睡觉就不能混着执行了看到了 kkk1看到了 kkk2第一个线程要睡觉第二个线程刚睡完添加了一对 3第二个线程要睡觉觉睡得短,所以很两个线程执行顺序完全不可控,不睡觉就不能混着执行了第一个线程刚睡完循环第2次,mapSize is 3看到了 kkk3看到了 kkk1看到了 kkk2第一个线程要睡觉第二个线程刚睡完添加了一对 4第二个线程要睡觉觉睡得短,所以很两个线程执行顺序完全不可控,不睡觉就不能混着执行了第一个线程刚睡完循环第3次,mapSize is 4看到了 kkk3看到了 kkk4看到了 kkk1看到了 kkk2第一个线程要睡觉第二个线程刚睡完添加了一对 5第二个线程要睡觉觉睡得短,所以很两个线程执行顺序完全不可控,不睡觉就不能混着执行了第一个线程刚睡完循环第4次,mapSize is 5看到了 kkk5看到了 kkk3看到了 kkk4

篇幅有限更多请见扩展链接:

http://www.mark-to-win.com/tutorial/jsp_7_AExampleConcurrentHashMap.html

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页