文档章节

Lock

learn_more
 learn_more
发布于 2016/08/28 16:00
字数 1028
阅读 198
收藏 2

1、JavaSE5的synchronized都是重量级的,而在JavaSE5之后出现了Lock接口以及相关接口来实现锁的功能。而且在JavaSE6 中Lock性能和Lock性能相差无几,但是synchronized能实现的功能Lock都能实现,原因是Lock功能更全面。

 

2、Lock接口提供的synchronized关键字不具备的主要特性有

1)尝试非阻塞地获取锁,通过 tryLock 进行非阻塞的尝试获取锁

2)能被中断地获取锁,通过lockInterruptibly 进行可中断的竞争锁,在锁竞争过程中可以被中断

3)超时获取锁,通过在tryLock获取锁时设置最大超时时间进行超时获取

4)必须手工释放锁,因为synchronized代码块中发生异常会自动释放锁,但是Lock则不会。

5)获取等待通知组件,通过调用 newCondition ,而且可以有多个Condition.

 

3、使用Lock的伪代码

Lock lock = new ReentrantLock();

lock.lock();

try{

// do something.

}finally{

lock.unlock();

}

1)注意必须在finally里面释放锁,原因是Lock不会自动释放

2)获取锁的过程最好写在try外面,原因是自定义的Lock可能在初始化Lock时发生异常,可能这个时候都还没有获取到锁,然后又调用释放锁,就会出现代码异常。

 

4、重入锁(ReentrantLock)

重入锁是指支持重进入的锁,也就是获取锁之后继续获取该锁是不会被阻塞。synchronized隐式含有重入锁,所以可以递归调用synchronized修饰的方法也不会被阻塞等待。

ReetrantLock 还可以支持公平锁和非公平锁,通过构造方法Boolean参数决定。

公平锁是指先对锁进行请求的锁一定先被满足。这意味着等待时间最长的线程最有可能获取到锁,这样可以避免活锁的发生。如果不管线程等待的时间任意分配锁则是非公平锁。

公平锁和非公平锁相对,公平性虽然保证了锁的获取按照了FIFO原则,而代价则是进行大量的线程切换,非公平锁虽然可能造成线程出现活锁的情况,但是避免线程的切换可以保证更大的吞吐量。

 

5、读写锁(ReentrantReadWriteLock)

无论是synchronized还是ReentrantLock都是排他锁,在同一时刻只允许一个线程进行访问,而读写锁在同一时刻可以运行多个读线程同时访问,但是在写线程访问时,所有的读线程和其他写线程都被阻塞。

读写锁维护了一对锁,一个读锁和一个写锁,通过分离读锁和写锁,使得并发性相比一般的排他锁有很大的提升。

读写锁可以降级(从写锁降级为读锁),但是不可以升级(从读锁升级为写锁),为什么不能升级呢?是因为假设有多个线程同时获取了读锁,突然有一个线程升级为写锁,那么计算他修改了数据,但是其他拥有读锁的线程读取的数据可能不是最新的,避免脏读数据所以不支持锁的升级。

如果读远远大于写,那么读写锁可谓是最佳之选了,下面就是使用读写锁实现缓存的代码

private static Map<String,Object> cache = new HashMap<>();

private static ReadWriteLock lock = new ReentrantReadWriteLock();

private static Lock readLock = lock.readLock();

private static Lock writeLock = lock.writeLock();

public static Object get(String key){

readLock.lock();

try{

return cache.get(key);

}finally{

readLock.unlock();

}

}

public static void put(String key, Object value){

writeLock.lock();

try{

cache.put(key, value);

}finally{

writeLock.unlock();

}

}

 

6、LockSupport

LockSupport是JDK中比较底层的类,用来创建锁和其他同步工具类的基本线程阻塞原语。

java锁和同步器框架的核心 AQS: AbstractQueuedSynchronizer,就是通过调用

LockSupport.park() 和 LockSupport.unpark()实现线程的阻塞和唤醒的。

LockSupport是可不重入。

示例代码(一直阻塞在 start,除非被唤醒 ):

public static void main(String[] args) {

System.out.println("start");

LockSupport.park();

System.out.println("end.");

}

 

 

 

 

© 著作权归作者所有

learn_more
粉丝 93
博文 240
码字总数 210196
作品 0
深圳
程序员
私信 提问
加载中

评论(1)

开源中国首席睡不够
开源中国首席睡不够
没没明白,读数据为什么还需要加锁呢?
InnoDB Lock Modes

InnoDB Lock Modes http://dev.mysql.com/doc/refman/5.7/en/innodb-lock-modes.html InnoDB implements standard row-level locking where there are two types of locks, shared (S) locks......

秋风醉了
2015/11/13
53
0
C++11 多线程 Mutex篇 (续)

Mutex篇续 上一篇传送门 std::uniquelock::trylock_until 尝试调用uniquelock所管理的对象(注:该对象也必须支持trylockuntil)的trylockuntil(abstime)给所管理的互斥量上锁. (注:trylockun...

SHIHUAMarryMe
2016/03/19
178
0
Locks in Java(翻译blog)

simple-lock from Java 5 the package java.util.concurrent.locks contains several lock implementations, so you may not have to implement your own locks. But you will still need to......

o0无忧亦无怖
2015/10/08
43
0
MySQL表锁_LOCK TABLES_UNLOCK TABLES

MySQL表锁LOCK TABLESUNLOCK TABLES mysql5.6 参考文档:http://dev.mysql.com/doc/refman/5.6/en/lock-tables.html 锁表和解锁表的基本语法 LOCK TABLES tblname [[AS] alias] locktype [,......

秋风醉了
2014/11/06
2.4K
0
C++11: Mutex和Lock

Mutex全名mutual exclusion(互斥体),是一个可加锁对象(lockable object),用来协助采取独占排他方式控制对资源的并发访问.这里的资源可能是个object,也可能是多个object的组合。为了获得独占式...

SHIHUAMarryMe
2016/03/18
399
0

没有更多内容

加载失败,请刷新页面

加载更多

这15个Vue指令,让你的项目开发爽到爆

受 AngularJS 的启发,Vue 内置了一些非常有用的指令(比如v-html 和 v-once等),每个指令都有自身的用途。完整的指令列表可以在这里查看. 这还没完,更棒的是可以开发自定义指令。Vue.js ...

李中凯
29分钟前
49
0
HTTP与HTTPS的区别

超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以...

无名氏的程序员
34分钟前
45
0
如何在A4纸张尺寸页面中制作HTML页面?

是否可以使HTML页面的行为类似于MS Word中的A4大小的页面? 本质上,我希望能够在浏览器中显示HTML页面,并以A4尺寸页面的尺寸概述内容。 为了简单起见,我假设HTML页面仅包含文本(没有图像...

javail
43分钟前
28
0
工作流-变量

流程变量的作用: 用来传递业务参数(比如请假天数,请假原因等); 指定连线完成任务(同意和拒绝); 动态指定任务的办理人. 流程变量要用的表: act_ru_variable; -- 正在执行的流程变量表...

小小明1995
44分钟前
49
0
JVM解毒——类加载子系统

带着问题,尤其是面试问题的学习才是最高效的。加油,奥利给! 点赞+收藏 就学会系列,文章收录在 GitHub JavaEgg ,N线互联网开发必备技能兵器谱 直击面试 看你简历写得熟悉JVM,那你说说类...

大猿帅
54分钟前
37
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部