多线程之锁 Lock,到底是啥

本文介绍了解决线程安全问题的方法之一:使用Lock锁。通过Java.util.concurrent.locks包下的Lock接口和ReentrantLock类实现更细粒度的锁控制,提供了一个解决多线程环境下资源共享问题的示例。

解决线程安全问题的第三种解决方法


使用 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();
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值