java锁
来源:互联网 发布:淘宝考试题和答案2017 编辑:程序博客网 时间:2024/06/06 08:35
import org.junit.Test;import java.util.ArrayList;import java.util.List;import java.util.concurrent.CompletableFuture;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;import java.util.concurrent.locks.ReentrantReadWriteLock;/** * Created by ibm on 2017/5/24. * java中锁的机制三种: * 1.synchronized的关键字 * <1.实现简单,<2.性能不是最佳,是串行而非并行 * 2.重入锁ReentrantLock * <1.提供更强大的解锁功能,设置等待时间,优先相应终端,<2.性能不是最佳,是串行而非并行 * 3.读写锁 * <1.读写分离,<2.读绝对并行(经过测试,在查询过多或者缓慢的情况下,writeLock的效率是其他两者的10倍左右) */public class LockExercise { private int value; private static Lock reentrantLock = new ReentrantLock(); private static ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock(); private static Lock readLock = readWriteLock.readLock(); private static Lock writeLock = readWriteLock.writeLock(); @Test public void test(){ long st = System.currentTimeMillis(); List<CompletableFuture> cfs = new ArrayList<>(); LockExercise lockExercise = new LockExercise(); for(int i = 0 ; i < 20 ;i++){ int j = i; cfs.add(CompletableFuture.runAsync(() -> { try { lockExercise.handleRead4ReadWriteLock(); } catch (InterruptedException e) { e.printStackTrace(); } })); } //等待所有线程执行完 CompletableFuture.allOf(cfs.toArray(new CompletableFuture[cfs.size()])).join(); System.out.println("value = " + lockExercise.value + " 耗时:" + (System.currentTimeMillis() - st) + " ms"); } //value = 0 耗时:20731ms private synchronized Object handleRead() throws InterruptedException { Thread.sleep(1000); return value; } //value = 19 耗时:20644 ms private synchronized void handleWrite(int value) throws InterruptedException { Thread.sleep(1000); this.value++; } //value = 0 耗时:20647 ms private Object handleRead4ReentrantLock() throws InterruptedException { try{ //模拟读操作,读操作的耗时越多,读写锁的优势就越明显(因为,重入锁总是要排队等待锁,而读写锁可以绝对并行) reentrantLock.lock(); Thread.sleep(1000); return value; }finally { //重入锁必须在finally中显示的释放锁 reentrantLock.unlock(); } } //value = 19 耗时:20667 ms private void handleWrite4ReentrantLock(int value) throws InterruptedException { try { reentrantLock.lock(); Thread.sleep(1000); this.value++; }finally { reentrantLock.unlock(); } } //value = 0 耗时:20667 ms private Object handleRead4ReadWriteLock() throws InterruptedException { try{ readLock.lock(); Thread.sleep(1000); return value; }finally { readLock.unlock(); } } //value = 0 耗时:3609 ms private void handleWrite4ReadWriteLock(int value) throws InterruptedException { try { writeLock.lock(); Thread.sleep(1000); this.value++; }finally { writeLock.unlock(); } }}
阅读全文
0 0
- 【java学习】java锁
- Java 锁
- java 锁
- java锁
- java 锁
- Java 锁
- java - 锁
- Java锁
- Java锁
- java锁
- java 锁
- Java 锁
- Java 锁
- java锁
- Java锁
- JAVA 锁
- JAVA--锁
- java锁
- Java调用Python脚本并获取返回值
- CMAKE_CURRENT_BINARY_DIR
- 剑指offer--python --c++--从尾到头打印链表
- Android各种屏幕分辨率(VGA、HVGA、QVGA、WQVGA、WVGA、FWVGA) 详解
- 5.23 JLL--实习日志--PropertyExtension和string_float问题
- java锁
- [Android][Animation]
- Jquery实现父子类复选框,选择父类子类全选,选择子类父类显示中间状态,并传值到java后台
- vue弹窗组件练习
- 找出数组中重复元素
- python 第三方库的安装
- android开发者选项里的动画的值的获取
- apk文件的内容
- 15、vue.js 之路由与子路由