`
Copperfield
  • 浏览: 260371 次
  • 性别: Icon_minigender_1
  • 来自: 上海
博客专栏
C407adc3-512e-3a03-a056-ce4607c3a3c0
java并发编程陷阱
浏览量:25142
社区版块
存档分类

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

 
阅读更多

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

 

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读取了旧的缓存。

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

 

 

 

 

分享到:
评论
5 楼 不懂甜言蜜语 2014-08-03  
感觉for循环里的需求只是线程范围内数据共享,用ThreadLocal
4 楼 不懂甜言蜜语 2014-08-03  
做到这个要求“总结:读时不能写 写时不能读  可以并发读  不能并发写”
3 楼 不懂甜言蜜语 2014-08-03  
怎么解决???能想到的只有读写锁了,可以吗?
2 楼 Chunxian 2014-07-17  
那个在for循环里面给cacheManage上锁,这样是不是就好了?(初学,我试了一下是可以的,个人觉得,操作什么就给什么上锁就行了)
1 楼 liyanjing1987 2014-05-06  
不是很明白,这个缓存里面读出来的?哪里的缓存?  Map本就放在内存里面,从哪来的缓存?

相关推荐

    java 并发编程的艺术pdf清晰完整版 源码

    并发编程是现代计算机系统中不可或缺的一部分,尤其是在多核处理器成为主流的今天。Java语言提供了丰富的并发工具和API,如线程、守护线程、线程池、同步机制(synchronized、wait/notify)、并发集合...

    汪文君高并发编程实战视频资源下载.txt

    │ 高并发编程第一阶段20讲、同步代码块以及同步方法之间的区别和关系.mp4 │ 高并发编程第一阶段21讲、通过实验分析This锁的存在.mp4 │ 高并发编程第一阶段22讲、通过实验分析Class锁的存在.mp4 │ 高并发编程...

    java并发编程实战(英文版)

    为了帮助开发者避免常见的并发陷阱,《Java并发编程实战》还提供了一系列的最佳实践建议,比如: - **正确使用同步机制**:强调了在使用`synchronized`关键字或`ReentrantLock`时需要注意的问题。 - **异常处理**:...

    Java 并发编程实战.pdf

    - **最佳实践**:结合具体案例分享Java并发编程的最佳实践,涵盖设计模式的应用、常见陷阱规避等方面。 ### 实战案例 - **多线程下载**:利用多线程技术实现文件的分块下载与合并,展示并发技术在提高下载速度方面...

    Java并发编程书籍高清版

    通过阅读这些书籍,开发者可以深入理解Java并发编程的底层机制,掌握有效的并发编程技巧,提高程序的运行效率,同时避免并发编程中常见的陷阱和问题。无论是初学者还是经验丰富的开发者,都能从中受益匪浅。

    java高并发编程第一版

    7. **并发编程最佳实践**:书中会讨论如何避免并发编程中的常见陷阱,比如避免过度同步、正确处理中断、避免死锁和饥饿等问题。此外,还会讲解如何进行并发性能调优,包括使用JVM的监控和调试工具。 8. **原子操作...

    java并发编程

    Java并发编程是Java开发者必须掌握的关键技能之一,它涉及到如何在多线程环境中高效、安全地执行程序。并发编程能够充分利用多核处理器的计算能力,提高应用程序的响应速度和整体性能。《Java编程并发实战》这本书是...

    JAVA并发编程实战

    通过学习《JAVA并发编程实战》这本书,开发者可以掌握以上这些关键概念,并学会如何在实际项目中应用,避免并发编程中的陷阱,编写出高效、稳定的多线程程序。书中可能还会深入讨论线程安全的编程习惯、性能调优技巧...

    汪文君高并发编程实战视频资源全集

    │ 高并发编程第一阶段20讲、同步代码块以及同步方法之间的区别和关系.mp4 │ 高并发编程第一阶段21讲、通过实验分析This锁的存在.mp4 │ 高并发编程第一阶段22讲、通过实验分析Class锁的存在.mp4 │ 高并发编程...

    java 并发编程实践 英文版 English

    总之,《Java并发编程实践》是一本全面、深入的指南,旨在帮助Java开发者掌握并发编程的核心概念和技术,无论是在设计、编码、调试还是维护多线程Java程序方面,都是一本不可或缺的参考书籍。随着摩尔定律效应逐渐...

    java并发编程实战(中文+高清版)pdf及源码

    《Java并发编程实战》是Java开发者必读的经典书籍之一,它深入浅出地探讨了Java平台上的并发编程技术。这本书不仅提供了理论知识,还包含了大量实际应用案例和源码,帮助读者更好地理解和掌握多线程编程的核心概念。...

    java并发编程电子书

    《Java并发编程实践》这本书是Java开发者深入理解并发编程的重要...通过阅读《Java并发编程实践》,开发者可以学习到如何编写高效、稳定的并发程序,避免并发陷阱,提升软件质量。同时,书中实例丰富,便于实践和理解。

    Java并发编程实践 高清扫描版

    《Java并发编程实践》这本书是Java开发者深入理解并发编程的重要参考资料。并发和多线程是现代计算机系统中不可或缺的部分,特别是在Java这样的多线程支持语言中。本书详细介绍了如何在Java环境中有效地设计和实现...

    JAVA并发编程实践(英文版+中文1-9章)

    在Java的世界里,并发编程是不可或缺的一部分,特别是在现代多核处理器系统中,理解和运用并发技术显得尤为重要。 本书的中文版稀缺性凸显了其价值,它不仅提供了英文原版,还包含了中文翻译的前九章,对于想要学习...

    java并发编程库

    总结起来,J.U.C库是Java并发编程中不可或缺的一部分,它以丰富的并发工具类、高效的执行效率和简洁的API设计,帮助开发者构建起强大的并发应用程序。通过理解J.U.C的工作原理和应用方法,开发者不仅能够编写出性能...

    JAVA并发编程实践

    总之,《JAVA并发编程实践》一书涵盖了从基础知识到高级技巧的全面内容,旨在帮助开发者在并发编程的世界中游刃有余,避免常见的陷阱,并提升软件的性能和可靠性。通过学习和实践书中的知识,你将能够更有效地驾驭...

    java并发编程经典书籍(英文版)

    Java并发编程是Java开发者必须掌握的关键技能之一,尤其是在多核处理器和分布式系统广泛使用的今天。以下是对标题和描述中提及的两本经典书籍——《Concurrent Programming in Java》和《Java Concurrency in ...

    [Java并发编程实践].(Java.Concurrency.in.Practice).Brian.Goetz.文字版.rar下载地址

    《Java并发编程实践》是Java并发编程领域的一本经典著作,由Brian Goetz等多位作者共同撰写。这本书深入探讨了如何在Java环境中有效地编写多线程和并发程序,旨在帮助开发者理解和解决并发编程中的各种挑战。 并发...

    Java虚拟机并发编程

    《Java虚拟机并发编程》一书是关于在JVM平台上进行高效并发编程的权威指南。它详细介绍了如何利用Java平台上的各种并发机制来设计、实现和优化多线程应用程序。书中不仅详细讲解了Java同步模型、软件事务内存(STM)...

Global site tag (gtag.js) - Google Analytics