当前位置:首页 > 开发 > 编程语言 > 编程 > 正文

并发编程陷阱系列 (一)同步不完全

发表于: 2013-04-02   作者:Copperfield   来源:转载   浏览:
摘要: 同步块未覆盖到所有场景。   import java.util.HashMap; import java.util.Map; public class CacheManage { private Map<String, String> cache = new HashMap<String, String>(); public static

同步块未覆盖到所有场景。

 

import java.util.HashMap;
import java.util.Map;

public class CacheManage {
	private Map<String, String> cache = new HashMap<String, String>();

	public static int THREADS_COUNT = 2;

	public void fresh() {
		synchronized (cache) {
			cache.clear();
		}
	}

	public void put(String key, String value) {
		synchronized (cache) {
			cache.put(key, value);
			System.out.println(Thread.currentThread().getName()
					+ "  cache.put--------" + value);
		}
	}

	public String get(String key) {
		System.out.println(Thread.currentThread().getName()
				+ "  cache.get-----" + cache.get(key));
		return cache.get(key);
	}

	public static void main(String[] args) {
		final CacheManage cacheManage = new CacheManage();
		Thread[] threads = new Thread[THREADS_COUNT];
		for (int i = 0; i < THREADS_COUNT; i++) {
			threads[i] = new Thread(new Runnable() {
				public void run() {
					for (int i = 0; i < 10; i++) {
						cacheManage.put("a", i + 1 + "");
						try {
							Thread.sleep(1000);
						} catch (InterruptedException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
						cacheManage.get("a");
					}
				}
			});
			threads[i].start();
		}
	}
}

 上面的缓存管理类,启动2个线程对其进行访问,每个线程做的事情都一样,先put后get,打印的结果为:

 

Thread-0  cache.put--------1

Thread-1  cache.put--------1

Thread-0  cache.get-----1

Thread-0  cache.put--------2

Thread-1  cache.get-----1

...

分析:Thread0在写数据(将缓存修改成2)的同时,thread1将数据取出来了,thread1读取了旧的缓存。

总结:读时不能写 写时不能读  可以并发读  不能并发写

 

 

 

 

并发编程陷阱系列 (一)同步不完全

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号