java锁

锁是一种线程同步机制,例如同步块。 锁是使用同步块在内部实现的。 因此,我们可以在Java中使用锁代替同步关键字。 锁比同步块更灵活,更复杂。

从Java 5版本开始,JDK提供了几种锁实现,例如ReentrantReadWriteLock,ReentrantLock和StampedLock等。

1.同步和锁之间的区别

1)我们可以设置一个超时来使用Lock.tryLock(long timeout,TimeUnit timeUnit)方法访问资源,而同步是不可能的。

2)同步块必须完全包含在一个进程中。 锁可以包含在两个单独的进程中:lock()和unlock()。

3)处于“等待”状态以获取对同步块的访问权限的线程不能被中断。 Lock API提供了方法lockInterruptible(),该方法可在线程等待Lock时中断线程。

2.实现简单锁:

使用synced关键字可以实现简单的增量功能。

public class Counter {private int number = 0;public void increment() {synchronized(number) {return ++number;}}
}

让我们使用Lock接口转换上述程序。

public class Counter {private int number = 0;private Lock lock = new Lock();public void increment() {                   lock.lock();int newNumber  = ++number;lock.unlock();return new number;}
}

在这里,我们使用的是锁接口,而不是synced关键字。

在增加数字之前,我们必须先锁定,以便其他任何人都不能在该块中输入任何内容,直到锁定增加并释放为止。

3.改进代码的方法

假设有些线程正在读取数据,有些线程正在向某些资源写入日期。 对于读取线程,如果一个线程正在从资源中读取数据,如果另一个线程也在从资源中读取数据,则不会造成任何问题,但是如果一个线程正在向资源中写入数据,则另一个线程也正在向资源中写入数据,则会引起问题。

  • 对于读取操作,可以允许多个线程从资源读取数据,但不允许写入线程。
  • 如果请求一个线程进行读取访问,而请求一个线程进行写入访问,那么优先级是什么,哪个线程可以访问资源?
  • 如果请求一个线程进行读取访问,则请求第二个线程进行写入访问,如果请求读取访问的线程更多,则如果我们仅允许读取请求的线程,则写入线程将需要等待不确定的时间,这导致饥饿。
  • 为了避免出现这种情况,Java在读取访问和写入访问时设置了一些规则。

3.1 ReadWriteLock

ReadWriteLock是Java 5版本中Java提供的实现; 它有两种方法,分别是Lock()和write-lock()。

Read Lock方法用于读取操作,而write-lock()方法用于写入操作。

3.2锁入

Java中的同步块是可重入的。 如果Java线程输入了同步的代码块,请在同步块的监视器对象上使用Lock。 然后,线程可以输入在同一监视对象上同步的其他Java代码块。

4.让我们考虑以下情形:

  1. Thread1正在获得读取访问权限。
  2. Thread2正在请求写访问权限; 由于只有一个阅读器,因此它将被阻止。
  3. 线程1再次请求读取访问权限,因为有一个写入请求,它将被阻止。

线程1和线程2都将被阻塞,从而导致死锁情况。

为了使锁重入,Java提供了另一种锁实现。

在使用重入锁定时,我们需要了解一些用例,例如,

在同一对象上,在某些方法中,线程可能会请求读取访问权限;在同一对象上,可能是线程在不同方法中,可能会请求写访问权限,反之亦然。

4.1阅读重入:

如果线程可以获取读访问权限(无写访问权限和写请求),或者该线程已经具有读访问权限,则该线程将被授予重入权限。 (无论是否有书面要求)。

4.2写重入:

仅当他们必须具有写访问权限时,才授予写重入权限。

4.3读写入口:

有时,线程必须同时读取和写入访问权限。 为此,线程必须是唯一的读取器。

4.4写读入口:

有时,必须具有写访问权的线程也需要读访问权。 如果有要求,应始终授予写者读访问权限。 如果该线程具有读取访问权限,则其他任何线程都不能具有读取或写入访问权限,因此这并不危险。

基于以上概念,让我们实现ArrayList的同步版本。

ThreadSaftyArrayList.java

public class ThreadSaftyArrayList {private final ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock();private final Lock writeLock = readWriteLock.writeLock();private final Lock readLock = readWriteLock.readLock();private List list = new ArrayList();public E get(int index){readLock.lock();try {               return list.get(index);} finally {readLock.unlock();}}public void set(E e){writeLock.lock();try {list.add(e);} finally {writeLock.unlock();}}public static void main(String[] args){ThreadSaftyArrayList threadSafeArrayList = new ThreadSaftyArrayList();threadSafeArrayList.set("1");threadSafeArrayList.set("2");threadSafeArrayList.set("3");System.out.println("Printing the First Element : "+threadSafeArrayList.get(1));}
}

注意:从最后一个子句中调用解锁():

当使用ReadWriteLock保护关键部分并且关键部分可能会引发异常时,从finally子句内部调用readUnlock()和writeUnlock()方法很重要。 这样做可以确保ReadWriteLock已解锁,以便其他线程可以锁定它。

伪代码:

lock.lockWrite();try{//do critical section code, which may throw an exception} finally {lock.unlockWrite();}

5.结论

在当前的博客中,我们了解了锁,如何在Java中实现锁,如何替换了同步块。 我们还了解了不同类型的锁,例如读取锁和写入锁。 我们了解了Starvation(何时发生)以及Reentrance锁,它的用途以及Java中提供的实现类。 最后,我们使用ReentrantReadWriteLock类编写了示例ThreadSafty Arraylist类。 希望以上教程对Java开发人员和社区有所帮助。

6.下载Java中的锁

这是Java中的锁的示例。

下载
您可以在此处下载此示例的完整源代码: Java中的Locks

翻译自: https://www.javacodegeeks.com/locks-in-java.html

java锁

java锁_Java锁相关推荐

  1. java 共享锁_Java锁--共享锁和ReentrantReadWriteLock

    ReadWriteLock 和 ReentrantReadWriteLock介绍 ReadWriteLock,顾名思义,是读写锁.它维护了一对相关的锁 - - "读取锁"和&quo ...

  2. java 代码锁_Java 锁的知识总结及实例代码

    java中有哪些锁 这个问题在我看了一遍后尽然无法回答,说明自己对于锁的概念了解的不够.于是再次翻看了一下书里的内容,突然有点打开脑门的感觉.看来确实是要学习的最好方式是要带着问题去学,并且解决问题. ...

  3. java 锁_Java 锁之我见

    今天我们来聊聊 Java 里面的各种锁:偏向锁.轻量级锁.重量级锁,以及三个锁之间是如何进行锁膨胀的. 众所周知,线程阻塞带来的上下文切换的代价是很大的,Java 为了尽量减少上下文的切换从而引入了更 ...

  4. java监视器_java锁与监视器概念 为什么wait、notify、notifyAll定义在Object中 多线程中篇(九)...

    在Java中,与线程通信相关的几个方法,是定义在Object中的,大家都知道Object是Java中所有类的超类 在Java中,所有的类都是Object,借助于一个统一的形式Object,显然在有些处 ...

  5. java 自旋锁_java锁的种类以及辨析(一):自旋锁

    public class SpinLock { private volatile int lock = 0; private static Unsafe theUnsafe; private stat ...

  6. java wait 释放锁_JAVA锁之wait,notify(wait会释放锁,notify仅仅只是通知,不释放锁)...

    wait是指在一个已经进入了同步锁的线程内,让自己暂时让出同步锁,以便其他正在等待此锁的线程可以得到同步锁并运行,只有其他线程调用了notify方法(notify并不释放锁,只是告诉调用过wait方法 ...

  7. java投票锁_Java并发编程锁之独占公平锁与非公平锁比较

    Java并发编程锁之独占公平锁与非公平锁比较 公平锁和非公平锁理解: 在上一篇文章中,我们知道了非公平锁.其实Java中还存在着公平锁呢.公平二字怎么理解呢?和我们现实理解是一样的.大家去排队本着先来 ...

  8. java 对变量加锁_Java最全锁剖析:独享锁/共享锁+公平锁/非公平锁+乐观锁/悲观锁...

    乐观锁 VS 悲观锁 乐观锁与悲观锁是一种广义上的概念,体现了看待线程同步的不同角度,在Java和数据库中都有此概念对应的实际应用. 1.乐观锁 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会 ...

  9. java 共享锁 独占锁_Java并发编程锁之独占公平锁与非公平锁比较

    Java并发编程锁之独占公平锁与非公平锁比较 公平锁和非公平锁理解: 在上一篇文章中,我们知道了非公平锁.其实Java中还存在着公平锁呢.公平二字怎么理解呢?和我们现实理解是一样的.大家取排队本着先来 ...

最新文章

  1. linux上jar包无法识别本地文件格式,解决使用maven将项目打包成jar包后运行在linux系统中无法读取jar包中文件的问题...
  2. 为什么放弃治疗_百度百科
  3. Scala隐式转换动态丰富类库功能
  4. 小程序 自定义遮照 mask 禁止上下滑动
  5. python偏函数和高阶函数_【Python入门】8.高阶函数之 匿名函数和偏函数
  6. Python OOP 项目实践:从农药到吃鸡
  7. Vue ---- 指令
  8. react-native开发安卓app相关使用总结
  9. 4服务器内存和普通内存_Java服务器内存过高CPU过高问题排查
  10. 学习笔记(11):ArcGIS10.X入门实战视频教程(GIS思维)-快速制作一幅土地利用现状图(引入制图表达)
  11. 仿京东商城源码java_Java+SSM实现类似京东的3C电子商城系统
  12. 「运维有小邓」三款性价比超高的AD域管理工具
  13. linux虚拟机内存不够,解决linux虚拟内存不够用的方法
  14. 伽罗瓦理论笔记暂记2
  15. Mysql,姓名按笔画排序
  16. 今天气温达到了39度 单位给买了雪糕降温
  17. 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java古诗词知识学习系统q5697
  18. 从玉农业谋定国家龙头企业-林裕豪:对话农民丰收节交易会
  19. 计算机博士5篇sci,研究员送5篇SCI论文给女博士 SCI论文到底是啥
  20. 德国意志战胜阿根廷野蛮!德国万岁!

热门文章

  1. 【每日一题】8月6日题目精讲—追债之旅
  2. 树上启发式合并 简单例题
  3. 【学习笔记】整体二分
  4. 递推:Ybtoj: D.4 序列个数
  5. Loj#3026-「ROIR 2018 Day1」管道监控【Trie,费用流】
  6. P4045-[JSOI2009]密码【AC自动机,状压dp】
  7. 【附答案】Java面试2019常考题目汇总(一)
  8. 1分钟了解区块链的本质
  9. 组合模式的安全模式与透明模式
  10. ssh(Spring+Spring mvc+hibernate)——EmpController