概述
各位小伙伴们大家好,在之前的文章中,小编主要介绍了解决线程安全问题的两种方法Java之线程安全的解决办法,同步代码和Java之解决线程安全的第二种方式,使用同步方法。这次小编要介绍的是解决线程安全问题的第三种方法,使用Lock锁,具体如下。
java.util.concurrent.locks.lock机制提供了比synchronized代码块和synchronized方法更广泛的锁定操作,同步代码块、同步方法具有的功能Lock都有,且更强大,更能体现面向对象。
Lock锁也称同步锁,加锁与释放锁方法如下:
public void lock():加同步锁。
public void unlock():释放同步锁。
使用步骤:
在成员位置创建一个ReentrantLock对象。在可能出现安全问题的代码前调用Lock接口中的方法Lock获取锁。在可能会出现安全问题的代码后调用Lock接口中的方法unlock释放锁。
代码如下:
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class RunnableImp1 implements Runnable {
//定义一个多线程共享票源
private int ticket = 100;
//1.在成员位置创建一个ReentrantLock对象
Lock l =new ReentrantLock();
//设置多线程任务:卖票
public void run() {
//使用死循环,让卖票操作重复执行
while (true) {
l.lock();//2.在可能出现安全问题的代码前调用Lock接口中的方法Lock获取锁。
//判断票是否存在
if (ticket > 0) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
//票存在,卖票ticket--
System.out.println(Thread.currentThread().getName() + "正在卖第" + ticket + "张票");
ticket--;
}
l.unlock();//3.在可能会出现安全问题的代码后调用Lock接口中的方法unlock释放锁。
}
}
}
关于释放锁,还有第二种方法,使用finally,这样的话,无论程序是否异常,都会释放锁,部分代码如下:
public void run() {
//使用死循环,让卖票操作重复执行
while (true) {
l.lock();
//判断票是否存在
if (ticket > 0) {
try {
Thread.sleep(10);
//票存在,卖票ticket--
System.out.println(Thread.currentThread().getName() + "正在卖第" + ticket + "张票");
ticket--;
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
l.unlock();//无论程序是否异常,都会把锁释放,可以提高程序的效率
}
}
}
}
关于解决线程安全问题的第三种方法,使用Lock锁,应该比前面两种方法简单,主要分为三步,创建一个ReentrantLock对象,在可能会出现安全问题的代码前获取锁,可能会出现安全问题的代码后释放锁。关于使用Lock锁解决线程安全问题,小编就先说到这里,希望这篇文章可以帮到大家,也欢迎各位小伙伴补充和纠错。
图片来自网络,如有侵权,请联系作者删除
最后
以上就是冷艳手机为你收集整理的java unlock_Java之解决线程安全问题的第三种方法,使用Lock锁的全部内容,希望文章能够帮你解决java unlock_Java之解决线程安全问题的第三种方法,使用Lock锁所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复