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毫秒
分享到:
相关推荐
Java多线程并发的程序中使用互斥锁有synchronized和ReentrantLock两种方式,这里我们来详解Java多线程编程中互斥锁ReentrantLock类的用法:
主要介绍了Java并发编程之显示锁ReentrantLock和ReadWriteLock读写锁,本文讲解了ReentrantLock概况、Lock接口、Lock使用、轮询锁的和定时锁、公平性、可中断获锁获取操作等内容,需要的朋友可以参考下
ReentrantLock类可以唤醒指定条件的线程,而object的唤醒是随机的 Condition类和Object类 Condition类的awiat方法和Object类的wait方法等效 Condition类的signal方法和Object类的notify方法等效 Condition类...
Java多线程ReentrantLock1
Java 多线程与并发(11_26)-JUC锁_ ReentrantLock详解
1、ReentrantLock简介 2、ReentrantLock函数列表 3、重入的实现 4、公平锁与非公平锁 5、ReentrantLock 扩展的功能 6
java多线程每个线程挨着打印ABC的4种实现方式,有4个线程t1、t2、t3、t4,t1打印A后t2打印A再t3打印A再t4打印A,然后从新回到t1打印B再t2打印B...t4打印B... 4个线程轮流打印abc... 一个线程可以理解为一个人,打印...
主要介绍了Java多线程 ReentrantLock互斥锁详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
java除了使用关键字synchronized外,还可以使用ReentrantLock实现独占锁的功能。而且ReentrantLock相比synchronized而言功能更加丰富,使用起来更为灵活,也更适合复杂的并发场景。这篇文章主要是从使用的角度来分析...
深入java并发编程,使用ReentrantLock和 Synchronized加锁
java多线程安全性基础介绍 线程安全 正确性 什么是线程安全性 原子性 竞态条件 i++ 读i ++ 值写回i 可见性 JMM 由于cpu和内存加载速度的差距,在两者之间增加了多级缓存导致,内存并不能直接对cpu可见。 ...
主要介绍了Java中的显示锁ReentrantLock使用与原理详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
带你看看Javad的锁-ReentrantLock前言ReentrantLock简介Synchronized对比用法源码分析代码结构方法分析SyncNonfairSyncFairSync非公平锁VS公平锁什么是公平非公平ReentrantLockReentrantLock的构造函数lock加锁方法...
目录线程安全 Thread Safety重入锁 ReentrantLock读写锁 ReadWriteLock倒计数器 CountDownLatch循环栅栏 CyclicBarrier信号量 Semaphore 线程安全 Thread Safety JMM JMM(Java Memory Model)是一种基于计算机内存...
看完《think in java》多线程章节,自己写的多线程文档,还结合了其他的相关网络资料。 线程 一. 线程池 1)为什么要使用线程池 2 2)一个具有线程池的工作队列 3 3)使用线程池的风险: 4 4)有效使用线程池的原则 5...
可重入锁: 也叫做递归锁,指的是同一线程 外层函数获得锁之后 ,...ReentrantLock 在Java也是一个基础的锁,ReentrantLock 实现Lock接口提供一系列的基础函数,开发人员可以灵活的是应用函数满足各种复杂多变应用场景;
主要介绍了Java多线程中ReentrantLock与Condition详解,需要的朋友可以参考下
Locks 框架概述: 简要介绍 Locks 框架,解释其在多线程编程中的作用和优势。比较 Locks 框架与传统 synchronized 关键字的不同之处。 ReentrantLock 简介: 详细讲解 ReentrantLock 的概念和特点。解释为什么它被...
private static class MyReentrantLock extends ReentrantLock {public MyReentrantLo
4种常用Java线程锁的特点,性能比较、使用场景 线程(thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发...