900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > Java之解决线程安全问题的第三种方法 使用Lock锁

Java之解决线程安全问题的第三种方法 使用Lock锁

时间:2020-07-29 22:50:49

相关推荐

Java之解决线程安全问题的第三种方法 使用Lock锁

各位小伙伴们大家好,在之前的文章中,小编主要介绍了解决线程安全问题的两种方法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锁解决线程安全问题,小编就先说到这里,希望这篇文章可以帮到大家,也欢迎各位小伙伴补充和纠错。

图片来自网络,如有侵权,请联系作者删除

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。