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

并发编程陷阱系列(七)读多写少使用synchronized导致性能下降

 
阅读更多

对并发读的情况进行测试:

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

这两个线程同时开始,同时结束。读锁允许多个线程共同读取资源(没有其他线程获取到写锁或者没有正在写数据)。

 

 

分享到:
评论

相关推荐

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

    │ 高并发编程第一阶段25讲、多Produce多Consume之间的通讯导致出现程序假死的原因分析.mp4 │ 高并发编程第一阶段26讲、多线程下的生产者消费者模型,以及详细介绍notifyAll方法.mp4 │ 高并发编程第一阶段27讲...

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

    9. **并发编程最佳实践**:最后,书中会提供一些并发编程的最佳实践,帮助读者避免常见的并发陷阱,写出更健壮、更高效的代码。 通过阅读《Java并发编程的艺术》这本书,开发者不仅可以掌握Java并发编程的基础知识...

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

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

    Java 并发编程实战.pdf

    根据提供的信息,“Java 并发编程实战.pdf”这本书聚焦于Java并发编程的实践与应用,旨在帮助读者深入了解并掌握Java中的多线程技术及其在实际项目中的应用技巧。虽然部分内容未能提供具体章节或实例,但从标题及...

    Java并发编程书籍高清版

    Java并发编程是Java开发中的重要领域,特别是在多核处理器和分布式系统中,高效地利用并发能力对于提升程序性能至关重要。本资源包含三本权威的Java并发编程书籍:《Java并发编程实践》、《java并发编程的艺术》以及...

    并发编程一之synchronized和volatile.rar

    - **使用场景**:适用于读多写少的场景,例如共享状态标志、配置参数等。 每个demo都可能展示了synchronized和volatile的一个或多个应用场景。例如: - **demo1**:可能演示了synchronized修饰实例方法,确保同一...

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

    │ 高并发编程第一阶段25讲、多Produce多Consume之间的通讯导致出现程序假死的原因分析.mp4 │ 高并发编程第一阶段26讲、多线程下的生产者消费者模型,以及详细介绍notifyAll方法.mp4 │ 高并发编程第一阶段27讲...

    java并发编程电子书

    《Java并发编程实践》这本书是Java开发者深入理解并发编程的重要参考资料。并发编程是现代软件开发中的核心技能之一,尤其是在多核处理器普及后,利用并发来提高程序性能和响应速度变得至关重要。本书旨在帮助读者...

    JAVA并发编程实战

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

    java并发编程

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

    java高并发编程第一版

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

    java并发编程库

    在没有J.U.C之前,Java开发者要处理多线程环境中的数据安全问题,往往需要直接使用synchronized关键字或wait/notify机制,这些方法在很多情况下会导致复杂的锁竞争和性能瓶颈。 J.U.C中的锁机制是并发编程中重要的...

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

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

    java 并发编程实践 英文版 English

    《Java并发编程实践》一书深入探讨了Java平台在Java 5.0和Java 6中引入的并发特性,以及并发编程的一般性原理。本书不仅由参与设计和实现这些特性的团队撰写,而且得到了业界专家的高度评价,如Sun Microsystems的...

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

    通过学习《Java并发编程实践》,开发者可以更深入地理解Java并发机制,提高代码的并发性能,避免常见的并发陷阱,从而写出更高效、更可靠的并发程序。这本书是Java并发编程的必读之作,无论你是初学者还是有经验的...

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

    《JAVA并发编程实践》是一本深入探讨Java多线程与并发控制的权威著作。这本书针对Java程序员,旨在帮助他们理解和掌握如何在并发环境中编写高效、可靠的代码。在Java的世界里,并发编程是不可或缺的一部分,特别是在...

    《java并发编程的核心方法和框架》

    - **CopyOnWriteArrayList**和**CopyOnWriteArraySet**:基于复制策略实现线程安全的列表和集合,适用于读多写少的场景。 - **BlockingQueue**:阻塞队列,常用于生产者-消费者模型,提供了`put()`和`take()`等...

    JAVA并发编程实践

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

    java高并发程序设计(原版电子书)

    7. **并发编程挑战**:探讨死锁、活锁、饥饿等并发问题及其解决策略,以及线程安全的编程习惯和陷阱。 8. **并发性能优化**:讲述如何分析和优化并发程序的性能,使用Java性能监控工具,如JConsole和VisualVM,以及...

    java 并发编程实战

    - **CopyOnWriteArrayList** 和 **CopyOnWriteArraySet**:读多写少场景下的高效数据结构,读操作无锁,写操作时复制原数组。 - **BlockingQueue**:线程安全的队列,支持生产者-消费者模式,如ArrayBlockingQueue、...

Global site tag (gtag.js) - Google Analytics