深入研究Java锁机制

Java的锁机制参考 https://zhongfucheng.bitcron.com/post/duo-xian-cheng/javasuo-ji-zhi-liao-jie-yi-xiahttp://cmsblogs.com/?page_id=111Java显示锁lock获取lock的几种方法 lock : 在锁上等待,直到获取锁; tryLock:立即返回,获得锁返回t...
摘要由CSDN通过智能技术生成

Java的锁机制

参考
https://zhongfucheng.bitcron.com/post/duo-xian-cheng/javasuo-ji-zhi-liao-jie-yi-xia

http://cmsblogs.com/?page_id=111

Java显示锁lock
  • 获取lock的几种方法
    lock : 在锁上等待,直到获取锁;
    tryLock:立即返回,获得锁返回true,没获得锁返回false;
    tryInterruptibly:在锁上等待,直到获取锁,但是会响应中断,这个方法优先考虑响应中断,而不是响应锁的普通获取或重入获取。
  • condition 用法 ???

1 同步锁 Synchronized 关键字

2 互斥锁 重入锁ReentrankLock 实现concurrent包中的lock接口

3 读写锁–ReadWriteLock接口及其实现类ReentrantReadWriteLock

4 Semaphore信号量

http://jison.site/2016/09/05/JavaThread3/#%E7%BA%BF%E7%A8%8B%E9%80%9A%E4%BF%A1

http://coolxing.iteye.com/blog/1236909

http://smallbug-vip.iteye.com/blog/2275743

1 同步锁 Synchronized 关键字

同步(synchronized)和监视器机制(主要是Object类的wait(), notify(), notifyAll()方法).

在并发的情况下,多个线程一起访问同一个资源时会出现线程同步的问题。

很多程序的bug都是由于线程不同步而造成的,解决线程不同步的方法最常用的是使用Java的锁机制对代码进行加锁,而加锁的方法不同和加锁的范围不同又分几种情况。除此之外还可以使用特殊域变量(volatile)实现线程同步。

那么在什么时候需要用到线程同步呢?前面说了,多个线程访问同一个资源的时候就需要对代码进行同步操作了。

比如对文件的读写操作,多个线程同时对某个变量进行修改,对数据库的增删改查的访问等等。

使用synchronized关键字进行加锁
在Java里面,每个类实例对应一把锁,在使用synchronized对同代码块或者方法进行加锁之后,多个线程同时访问加锁代码时,必须要先获取该实例对象的锁才可以执行这一段代码,并且在这段代码执行过程中,其它线程无法获取这个对象的锁,也就无法进入这段同步代码块或者同步方法中了,确保了并发时多线程的同步问题,这就是Java对象锁的排他性。

使用synchronized关键字对代码块进行加锁
在并发编程中,使用synchronized关键字对代码加锁是很消耗性能的一件事,而有时候我们只需要对一部分代码进行同步操作就可以了,这样相对来说程序性能会好一点,这样的操作我们称为同步代码块。

使用synchronized关键字对实例方法进行加锁
对实例方法加锁只需要在方法签名上加一个synchronized修饰符即可。当一个类中有多个被synchronized关键字修饰的同步方法时,并且同一时间有一个线程进入其中一个同步方法时,别的线程就只能这个线程将这个同步方法执行完毕,才能进入执行这个同步方法或者该类下别的实例同步方法。
使用synchronized关键字对类进行加锁

2 互斥锁 重入锁ReentrankLock 实现concurrent包中的lock接口

所谓互斥锁, 指的是一次最多只能有一个线程持有的锁. 在jdk1.5之前, 我们通常使用synchronized机制控制多个线程对共享资源的访问. 而现在, Lock提供了比synchronized机制更广泛的锁定操作, Lock和synchronized机制的主要区别:

synchronized机制提供了对与每个对象相关的隐式监视器锁的访问, 并强制所有锁获取和释放均要出现在一个块结构中, 当获取了多个锁时, 它们必须以相反的顺序释放. synchronized机制对锁的释放是隐式的, 只要线程运行的代码超出了synchronized语句块范围, 锁就会被释放. 而Lock机制必须显式的调用Lock对象的unlock()方法才能释放锁, 这为获取锁和释放锁不出现在同一个块结构中, 以及以更自由的顺序释放锁提供了可能. 以下代码演示了在不同的块结构中获取和释放锁:
Java代码 收藏代码

public 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值