解决线程安全问题的第三种解决方法
使用 lock 锁
Java.util.concurrent.locks.lock 接口
lock 实现了 比 synchronized 方法 和语句 更加广泛的锁定操作
public void lock(); 获取锁
public void unlock(); 释放锁
Java.util.concurrent.locks.ReentrankLock implements Lock 接口
使用 步骤:
1. 在成员的位置创建一个 ReentrankLock 对象
2. 在可能会引发 线程安全问题的代码前,调用 Lock 接口中 lock 方法获取锁
3. 在可能会引发 线程安全问题的代码后,调用 Lock 接口中 unLock 释放锁
代码示例
实现类
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
// 实现买票案例
public class RunnableImpl implements Runnable {
// 定义 一个 多线程共享的资源票
private static int ticket = 100;
// 1. 在成员位置创建一个 ReentrankLock
Lock Lock = new ReentrantLock();
// 设置线程的任务 : 卖票 // 窗口指代的是 线程
@Override
public void run() {
// 先判断 票 是否存在
while (true) {
// 2. 加锁
Lock.lock();
if (ticket > 0) {
try {
Thread.sleep(100);
System.out.println(Thread.currentThread().getName() + "--> 正在售卖,第 " + ticket-- + " 张票");
} catch (Exception e) {
e.printStackTrace();
}finally {
// 3.释放
// 无论程序是否出现异常,程序此时都会把锁释放掉
// 带有异常可能无法访问到,建议放到 finally 中,一定会使用到
// 在 finally 语句块中一般用于 资源的释放,关闭 IO 流,释放 lock ,关闭数据库连接
Lock.unlock();
}
// 票存在,卖出
}
}
}
}
测试类
/*
模拟卖票
创建 3个线程(窗口),同时开启,对共享的票进行售卖
*/
public class SaleTicket {
public static void main(String[] args) {
// 创建 Runnable 接口的实现类对象
Runnable run = new RunnableImpl();
System.out.println(" run 的地址 : "+run);
// 创建 Thread 类的对象,构造方法中传递 Runnable 接口的实现类对象
Thread t1 = new Thread(run);
Thread t2 = new Thread(run);
Thread t3 = new Thread(run);
Thread t4 = new Thread(run);
Thread t5 = new Thread(run);
Thread t6 = new Thread(run);
t1.start();
t2.start();
t3.start();
t4.start();
t5.start();
t6.start();
}
}
本文介绍了解决线程安全问题的方法之一:使用Lock锁。通过Java.util.concurrent.locks包下的Lock接口和ReentrantLock类实现更细粒度的锁控制,提供了一个解决多线程环境下资源共享问题的示例。

1416

被折叠的 条评论
为什么被折叠?



