`

java多线程编程——显示锁ReentrantLock(一)

阅读更多
package test;

/**
 * 内部锁
 *
 * @author Administrator
 *
 */
public class SynchronizedBenchmarkDemo implements Counter {
	private long count = 0;

	@Override
	public long getValue() {
		return count;
	}

	@Override
	public synchronized void increment() {
		count++;
	}

}


package test;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 不公平重入锁
 *
 * @author Administrator
 *
 */
@SuppressWarnings("all")
public class ReentrantLockUnfairBeanchmarkDemo implements Counter {
	private volatile long count = 0;
	private Lock lock;

	public ReentrantLockUnfairBeanchmarkDemo() {
		// 使用不公平锁
		lock = new ReentrantLock(false);
	}

	@Override
	public long getValue() {
		return count;
	}

	@Override
	public void increment() {
		lock.lock();
		try {
			count++;
		} finally {
			lock.unlock();
		}
	}

}


package test;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 公平重入锁
 *
 * @author Administrator
 *
 */
@SuppressWarnings("all")
public class ReentrantLockFairBeanchmarkDemo implements Counter {
	private volatile long count = 0;
	private Lock lock;

	public ReentrantLockFairBeanchmarkDemo() {
		// 创建公平锁
		lock = new ReentrantLock(true);
	}

	@Override
	public long getValue() {
		return count;
	}

	@Override
	public void increment() {
		lock.lock();
		try {
			count++;
		} finally {
			lock.unlock();
		}
	}

}


package test;

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

/**
 * 三种类型的同步锁:内部锁、不公平锁、公平锁,每种类型的锁各自创建2000个线程,然后每个线程访问带有锁得变量100次,并加1。
 * 统计各种锁并发访问时消耗的时间
 *
 * @author Administrator
 *
 */
@SuppressWarnings("all")
public class BenchmarkTest {
	private Counter counter;
	// 一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点
	private CyclicBarrier barrier;
	private int threadNum;
	private int loopNum;
	private String testName;
	/*******************************************************************
	 * 用于记录由该对象创建的threadNum线程统开始循环和结束循环的起止时间
	 */
	public long begin;
	public long end;

	private BenchmarkTest(Counter counter, int threadNum, int loopNum, String testName) {
		this.counter = counter;
		this.threadNum = threadNum;
		this.loopNum = loopNum;
		this.testName = testName;
		barrier = new CyclicBarrier(threadNum, new BarrierTime(this));
	}

	public void test() {
		try {
			for (int i = 0; i < threadNum; i++) {
				new TestThread(counter, loopNum, this).start();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		try {
			int threadNum = 2000;
			int loopNum = 100;

			new BenchmarkTest(new SynchronizedBenchmarkDemo(), threadNum, loopNum, "内部锁").test();
			Thread.sleep(5000);

			new BenchmarkTest(new ReentrantLockUnfairBeanchmarkDemo(), threadNum, loopNum, "不公平锁").test();
			Thread.sleep(5000);

			new BenchmarkTest(new ReentrantLockFairBeanchmarkDemo(), threadNum, loopNum, "公平锁锁").test();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

	class TestThread extends Thread {
		int loopNum = 100;
		private Counter counter;
		private BenchmarkTest benchmarkTest;

		private TestThread(final Counter counter, int loopNum, BenchmarkTest benchmarkTest) {
			this.counter = counter;
			this.loopNum = loopNum;
			this.benchmarkTest = benchmarkTest;
		}

		public void run() {
			try {
				// 等待所有线程开始
				barrier.await();
				for (int i = 0; i < this.loopNum; i++) {
					counter.increment();
				}
				// 等待所有线程结束
				barrier.await();
			} catch (Exception e) {
				throw new RuntimeException();
			}
		}
	}

	class BarrierTime implements Runnable {
		private BenchmarkTest benchmarkTest;

		public BarrierTime(BenchmarkTest benchmarkTest) {
			this.benchmarkTest = benchmarkTest;
		}

		@Override
		public void run() {
			if (benchmarkTest.begin == 0) {
				benchmarkTest.begin = System.currentTimeMillis();
			} else {
				benchmarkTest.end = System.currentTimeMillis();
			}
			if (benchmarkTest.end != 0) {
				System.out.println(benchmarkTest.testName + "共花费时间:" + (benchmarkTest.end - benchmarkTest.begin) + "毫秒");
			}
		}

	}
}


    内部锁共花费时间:260毫秒
    不公平锁共花费时间:26毫秒
    公平锁锁共花费时间:1471毫秒




分享到:
评论
1 楼 jxqlovejava 2011-10-20  

相关推荐

    Java多线程——线程八锁案例分析.docx

    在Java多线程编程中,线程安全是一个关键概念,特别是在并发访问共享资源时。"线程八锁案例分析"文档中的示例着重展示了`synchronized`关键字如何在控制线程同步方面发挥作用。以下是对这些案例的详细分析: 案例1...

    java多线程编程技术

    Java多线程编程技术是Java编程语言中的一项高级技术,其主要目的是让开发者能够编写出能够同时执行多个操作的程序,以提高程序的执行效率和响应性。在多核处理器日益普及的今天,合理运用多线程技术对于充分利用系统...

    JAVA多线程编程案例_火车站售票系统

    ### JAVA多线程编程案例——火车站售票系统 #### 概述 本文档通过设计一个简单的Java多线程机制实现了一个火车站售票系统的模拟程序。该系统主要用于演示如何在Java中使用多线程技术来处理并发访问资源的问题,并...

    《软件开发基础(Java)》实验报告-Java多线程编程.docx

    在本实验报告中,我们关注的是Java多线程编程,这是Java编程中一个重要的主题,尤其是在并发处理和高性能系统设计中。线程是操作系统分配CPU时间的基本单位,它允许一个程序内部同时执行多个任务,提高了应用程序的...

    Java多线程ReentrantLock1

    总结来说,ReentrantLock在Java多线程编程中扮演着关键角色,提供了灵活的锁管理机制,包括公平性和非公平性选择,以及可中断和定时的锁获取方式。了解和熟练掌握ReentrantLock的使用,能够帮助开发者编写出高效、...

    JAVA项目——多线程下载代码

    通过这个项目,学习者可以掌握Java多线程编程的基本概念和实际应用,了解线程池的使用,以及如何在并发环境中处理文件I/O。此外,还将锻炼到问题解决能力,如处理网络不稳定、断点续传等常见问题。对于Java程序员来...

    java多线程设计

    一、Java多线程基础 1. 线程的创建:Java提供了两种创建线程的方式——继承Thread类和实现Runnable接口。继承Thread类可以直接创建一个新的线程类,而实现Runnable接口则可以将线程逻辑封装在任何类中,更利于代码...

    通过多线程编程在Java中发现的并发模式和特性——线程、锁、原子等.zip

    在Java编程中,多线程是处理并发执行的关键技术,它允许程序同时执行多个任务,提高了系统的效率和响应性。本资料主要探讨了Java中的并发模式和特性,涉及线程、锁以及原子操作等概念。 1. **线程**: - **创建...

    经典线程例子——Java线程学习指南

    3. Lock接口与ReentrantLock类:提供比synchronized更细粒度的锁控制,支持公平锁和非公平锁,以及可中断和定时等待的获取锁机制。 4. wait(), notify()和notifyAll():在synchronized代码块内使用,用于线程间的...

    Java练手小项目——多线程聊天室.zip

    【Java练手小项目——多线程...通过这个“Java练手小项目——多线程聊天室”,你可以深入了解Java多线程的原理和实践,同时学习到网络编程和并发集合的运用,这对于提升你的Java编程技能和解决实际问题的能力大有裨益。

    java 多线程交互简单范例

    总结来说,这个压缩包提供了一个学习和实践Java多线程同步的实例。通过分析和运行这些代码,我们可以更好地理解如何在并发环境中控制线程的执行顺序,避免数据不一致,以及如何有效地设计和实现线程间的协作。对于...

    Java多线程下载网络图片

    在Java编程中,多线程是一项关键技能,尤其在处理并发任务时,如我们的示例——"Java多线程下载网络图片"。这个场景展示了如何利用多线程技术提高程序性能,减少用户等待时间,同时优化系统资源的使用。下面我们将...

    Java 多线程与并发(3-26)-Java 并发 - Java中所有的锁.pdf

    Java并发编程中,锁是一种关键机制,用于控制多个线程对共享资源的访问。本文主要探讨了Java中的两种广义锁概念——乐观锁和悲观锁,以及自旋锁和适应性自旋锁的区别和应用场景。 1. 乐观锁与悲观锁: 乐观锁认为在...

    Java多线程运算集合

    - Java多线程编程涉及多个方面的知识和技术,从基本的线程创建到高级的同步机制,都是开发高效、可靠的多线程应用程序所必需的。 - 正确理解和使用这些技术对于提高程序性能、避免死锁等问题至关重要。

    java 多线程锁的解释 实例

    ### Java多线程锁的理解与实例 在Java编程语言中,多线程是实现程序并发执行的关键技术之一。为了确保多个线程访问共享资源时的数据一致性及安全性,Java提供了多种同步机制,其中最为常见的就是锁机制。本文将详细...

    基于java swing的多线程电梯调度模拟

    总的来说,这个项目涉及到Java多线程编程、GUI设计、对象间的通信以及线程同步等多个核心概念,是学习和实践Java并发编程的好例子。通过理解和分析这个项目,开发者不仅可以深入理解Java的并发机制,还能掌握如何在...

    java多线程学习笔记02(csdn)————程序.pdf

    Java多线程编程是开发高并发应用的关键技术之一。在这个学习笔记中,主要讨论了Java中的线程同步机制,包括volatile关键字、synchronized以及Lock接口,特别是ReentrantLock的使用。 首先,对于线程1和线程2的疑惑...

    Java面试之——线程编程方面[借鉴].pdf

    Java线程编程是Java开发中的重要组成部分,尤其在面试中,这部分知识经常被用来测试候选人的并发编程能力。以下是对给定文件中提到的一些关键知识点的详细解释: 1. **线程实现方式**:Java中创建线程有两种方式,...

    java 多线程同步方法的实例

    在Java编程语言中,多...同时,理解并掌握这些同步机制的原理和使用场景,对于提升Java多线程编程的能力至关重要。在实际开发中,要特别注意死锁、活锁和饥饿等问题,避免因线程同步不当而导致的性能下降或程序错误。

Global site tag (gtag.js) - Google Analytics