java锁_Java锁
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.让我们考虑以下情形:
- Thread1正在获得读取访问权限。
- Thread2正在请求写访问权限; 由于只有一个阅读器,因此它将被阻止。
- 线程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锁相关推荐
- java 共享锁_Java锁--共享锁和ReentrantReadWriteLock
ReadWriteLock 和 ReentrantReadWriteLock介绍 ReadWriteLock,顾名思义,是读写锁.它维护了一对相关的锁 - - "读取锁"和&quo ...
- java 代码锁_Java 锁的知识总结及实例代码
java中有哪些锁 这个问题在我看了一遍后尽然无法回答,说明自己对于锁的概念了解的不够.于是再次翻看了一下书里的内容,突然有点打开脑门的感觉.看来确实是要学习的最好方式是要带着问题去学,并且解决问题. ...
- java 锁_Java 锁之我见
今天我们来聊聊 Java 里面的各种锁:偏向锁.轻量级锁.重量级锁,以及三个锁之间是如何进行锁膨胀的. 众所周知,线程阻塞带来的上下文切换的代价是很大的,Java 为了尽量减少上下文的切换从而引入了更 ...
- java监视器_java锁与监视器概念 为什么wait、notify、notifyAll定义在Object中 多线程中篇(九)...
在Java中,与线程通信相关的几个方法,是定义在Object中的,大家都知道Object是Java中所有类的超类 在Java中,所有的类都是Object,借助于一个统一的形式Object,显然在有些处 ...
- java 自旋锁_java锁的种类以及辨析(一):自旋锁
public class SpinLock { private volatile int lock = 0; private static Unsafe theUnsafe; private stat ...
- java wait 释放锁_JAVA锁之wait,notify(wait会释放锁,notify仅仅只是通知,不释放锁)...
wait是指在一个已经进入了同步锁的线程内,让自己暂时让出同步锁,以便其他正在等待此锁的线程可以得到同步锁并运行,只有其他线程调用了notify方法(notify并不释放锁,只是告诉调用过wait方法 ...
- java投票锁_Java并发编程锁之独占公平锁与非公平锁比较
Java并发编程锁之独占公平锁与非公平锁比较 公平锁和非公平锁理解: 在上一篇文章中,我们知道了非公平锁.其实Java中还存在着公平锁呢.公平二字怎么理解呢?和我们现实理解是一样的.大家去排队本着先来 ...
- java 对变量加锁_Java最全锁剖析:独享锁/共享锁+公平锁/非公平锁+乐观锁/悲观锁...
乐观锁 VS 悲观锁 乐观锁与悲观锁是一种广义上的概念,体现了看待线程同步的不同角度,在Java和数据库中都有此概念对应的实际应用. 1.乐观锁 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会 ...
- java 共享锁 独占锁_Java并发编程锁之独占公平锁与非公平锁比较
Java并发编程锁之独占公平锁与非公平锁比较 公平锁和非公平锁理解: 在上一篇文章中,我们知道了非公平锁.其实Java中还存在着公平锁呢.公平二字怎么理解呢?和我们现实理解是一样的.大家取排队本着先来 ...
最新文章
- linux上jar包无法识别本地文件格式,解决使用maven将项目打包成jar包后运行在linux系统中无法读取jar包中文件的问题...
- 为什么放弃治疗_百度百科
- Scala隐式转换动态丰富类库功能
- 小程序 自定义遮照 mask 禁止上下滑动
- python偏函数和高阶函数_【Python入门】8.高阶函数之 匿名函数和偏函数
- Python OOP 项目实践:从农药到吃鸡
- Vue ---- 指令
- react-native开发安卓app相关使用总结
- 4服务器内存和普通内存_Java服务器内存过高CPU过高问题排查
- 学习笔记(11):ArcGIS10.X入门实战视频教程(GIS思维)-快速制作一幅土地利用现状图(引入制图表达)
- 仿京东商城源码java_Java+SSM实现类似京东的3C电子商城系统
- 「运维有小邓」三款性价比超高的AD域管理工具
- linux虚拟机内存不够,解决linux虚拟内存不够用的方法
- 伽罗瓦理论笔记暂记2
- Mysql,姓名按笔画排序
- 今天气温达到了39度 单位给买了雪糕降温
- 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java古诗词知识学习系统q5697
- 从玉农业谋定国家龙头企业-林裕豪:对话农民丰收节交易会
- 计算机博士5篇sci,研究员送5篇SCI论文给女博士 SCI论文到底是啥
- 德国意志战胜阿根廷野蛮!德国万岁!