对并发读的情况进行测试:
public class SynchronizedDemo { static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); public static void main(String[] args) throws Exception { Data data = new Data(); Worker t1 = new Worker(data, true, "t1"); Worker t2 = new Worker(data, true, "t2"); t1.start(); t2.start(); } static class Worker extends Thread { Data data; boolean read; public Worker(Data data, boolean read, String threadName) { super(threadName); this.data = data; this.read = read; } public void run() { if (read) data.get(); else data.set(); } } /** * 数据类 */ static class Data { /** * 写数据 */ public synchronized void set() { System.out.println(Thread.currentThread().getName() + " set:begin " + sdf.format(new Date())); try { Thread.sleep(5000); } catch (Exception e) { } finally { System.out.println(Thread.currentThread().getName() + " set:end " + sdf.format(new Date())); } } /** * 读数据 */ public synchronized int get() { System.out.println(Thread.currentThread().getName() + " get :begin " + sdf.format(new Date())); try { Thread.sleep(5000); } catch (Exception e) { } finally { System.out.println(Thread.currentThread().getName() + " get :end " + sdf.format(new Date())); } return 1; } } }
synchronized执行的结果:
t1 get :begin 2013-05-06 22:57:50
t1 get :end 2013-05-06 22:57:55
t2 get :begin 2013-05-06 22:57:55
t2 get :end 2013-05-06 22:58:00
t1先执行,t1 结束后;t2再开始执行,直到结束。对象的方法中一旦加入synchronized修饰,则任何时刻只能有一个线程访问synchronized修饰的方法,所以我们看到结果中是串行执行的。
public class ReadWriteLockDemo { static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); public static void main(String[] args) throws Exception { Data data = new Data(); Worker t1 = new Worker(data, true, "t1"); Worker t2 = new Worker(data, true, "t2"); t1.start(); t2.start(); } static class Worker extends Thread { Data data; boolean read; public Worker(Data data, boolean read, String threadName) { super(threadName); this.data = data; this.read = read; } public void run() { if (read) data.get(); else data.set(); } } /** * 数据类 */ static class Data { ReadWriteLock lock = new ReentrantReadWriteLock(); Lock read = lock.readLock(); Lock write = lock.writeLock(); /** * 写数据 */ public void set() { write.lock(); System.out.println(Thread.currentThread().getName() + " set:begin " + sdf.format(new Date())); try { Thread.sleep(5000); } catch (Exception e) { } finally { System.out.println(Thread.currentThread().getName() + " set:end " + sdf.format(new Date())); write.unlock(); } } /** * 读数据 */ public int get() { read.lock(); System.out.println(Thread.currentThread().getName() + " get :begin " + sdf.format(new Date())); try { Thread.sleep(5000); } catch (Exception e) { } finally { System.out.println(Thread.currentThread().getName() + " get :end " + sdf.format(new Date())); read.unlock(); } return 1; } } }
使用读锁的执行结果:
t1 get :begin 2013-05-06 23:00:41
t2 get :begin 2013-05-06 23:00:41
t1 get :end 2013-05-06 23:00:46
t2 get :end 2013-05-06 23:00:46
这两个线程同时开始,同时结束。读锁允许多个线程共同读取资源(没有其他线程获取到写锁或者没有正在写数据)。
相关推荐
│ 高并发编程第一阶段25讲、多Produce多Consume之间的通讯导致出现程序假死的原因分析.mp4 │ 高并发编程第一阶段26讲、多线程下的生产者消费者模型,以及详细介绍notifyAll方法.mp4 │ 高并发编程第一阶段27讲...
9. **并发编程最佳实践**:最后,书中会提供一些并发编程的最佳实践,帮助读者避免常见的并发陷阱,写出更健壮、更高效的代码。 通过阅读《Java并发编程的艺术》这本书,开发者不仅可以掌握Java并发编程的基础知识...
为了帮助开发者避免常见的并发陷阱,《Java并发编程实战》还提供了一系列的最佳实践建议,比如: - **正确使用同步机制**:强调了在使用`synchronized`关键字或`ReentrantLock`时需要注意的问题。 - **异常处理**:...
根据提供的信息,“Java 并发编程实战.pdf”这本书聚焦于Java并发编程的实践与应用,旨在帮助读者深入了解并掌握Java中的多线程技术及其在实际项目中的应用技巧。虽然部分内容未能提供具体章节或实例,但从标题及...
Java并发编程是Java开发中的重要领域,特别是在多核处理器和分布式系统中,高效地利用并发能力对于提升程序性能至关重要。本资源包含三本权威的Java并发编程书籍:《Java并发编程实践》、《java并发编程的艺术》以及...
- **使用场景**:适用于读多写少的场景,例如共享状态标志、配置参数等。 每个demo都可能展示了synchronized和volatile的一个或多个应用场景。例如: - **demo1**:可能演示了synchronized修饰实例方法,确保同一...
│ 高并发编程第一阶段25讲、多Produce多Consume之间的通讯导致出现程序假死的原因分析.mp4 │ 高并发编程第一阶段26讲、多线程下的生产者消费者模型,以及详细介绍notifyAll方法.mp4 │ 高并发编程第一阶段27讲...
《Java并发编程实践》这本书是Java开发者深入理解并发编程的重要参考资料。并发编程是现代软件开发中的核心技能之一,尤其是在多核处理器普及后,利用并发来提高程序性能和响应速度变得至关重要。本书旨在帮助读者...
通过学习《JAVA并发编程实战》这本书,开发者可以掌握以上这些关键概念,并学会如何在实际项目中应用,避免并发编程中的陷阱,编写出高效、稳定的多线程程序。书中可能还会深入讨论线程安全的编程习惯、性能调优技巧...
Java并发编程是Java开发者必须掌握的关键技能之一,它涉及到如何在多线程环境中高效、安全地执行程序。并发编程能够充分利用多核处理器的计算能力,提高应用程序的响应速度和整体性能。《Java编程并发实战》这本书是...
7. **并发编程最佳实践**:书中会讨论如何避免并发编程中的常见陷阱,比如避免过度同步、正确处理中断、避免死锁和饥饿等问题。此外,还会讲解如何进行并发性能调优,包括使用JVM的监控和调试工具。 8. **原子操作...
在没有J.U.C之前,Java开发者要处理多线程环境中的数据安全问题,往往需要直接使用synchronized关键字或wait/notify机制,这些方法在很多情况下会导致复杂的锁竞争和性能瓶颈。 J.U.C中的锁机制是并发编程中重要的...
《Java并发编程实践》这本书是Java开发者深入理解并发编程的重要参考资料。并发和多线程是现代计算机系统中不可或缺的部分,特别是在Java这样的多线程支持语言中。本书详细介绍了如何在Java环境中有效地设计和实现...
《Java并发编程实践》一书深入探讨了Java平台在Java 5.0和Java 6中引入的并发特性,以及并发编程的一般性原理。本书不仅由参与设计和实现这些特性的团队撰写,而且得到了业界专家的高度评价,如Sun Microsystems的...
通过学习《Java并发编程实践》,开发者可以更深入地理解Java并发机制,提高代码的并发性能,避免常见的并发陷阱,从而写出更高效、更可靠的并发程序。这本书是Java并发编程的必读之作,无论你是初学者还是有经验的...
《JAVA并发编程实践》是一本深入探讨Java多线程与并发控制的权威著作。这本书针对Java程序员,旨在帮助他们理解和掌握如何在并发环境中编写高效、可靠的代码。在Java的世界里,并发编程是不可或缺的一部分,特别是在...
- **CopyOnWriteArrayList**和**CopyOnWriteArraySet**:基于复制策略实现线程安全的列表和集合,适用于读多写少的场景。 - **BlockingQueue**:阻塞队列,常用于生产者-消费者模型,提供了`put()`和`take()`等...
总之,《JAVA并发编程实践》一书涵盖了从基础知识到高级技巧的全面内容,旨在帮助开发者在并发编程的世界中游刃有余,避免常见的陷阱,并提升软件的性能和可靠性。通过学习和实践书中的知识,你将能够更有效地驾驭...
7. **并发编程挑战**:探讨死锁、活锁、饥饿等并发问题及其解决策略,以及线程安全的编程习惯和陷阱。 8. **并发性能优化**:讲述如何分析和优化并发程序的性能,使用Java性能监控工具,如JConsole和VisualVM,以及...
- **CopyOnWriteArrayList** 和 **CopyOnWriteArraySet**:读多写少场景下的高效数据结构,读操作无锁,写操作时复制原数组。 - **BlockingQueue**:线程安全的队列,支持生产者-消费者模式,如ArrayBlockingQueue、...