同步锁Lock
2024-08-25 12:06:46
用于解决多线程安全问题有三种方式:
- 同步代码块(隐式锁,基于JVM)
- 同步方法(隐式锁,基于JVM)
- 同步锁(显式锁,jdk1.5后出现,相对于前两种方式,更加灵活)
下面通过一段程序来说明一下同步锁的简单使用。
package com.ccfdod.juc; import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; /**
* 用于解决多线程安全问题的方式:
* 1、同步代码块(synchronized):隐式锁,基于jvm
* 2、同步方法(synchronized):隐式锁,基于jvm
* 3、同步锁Lock:出现于jdk1.5后,相对于前两种方式,更加灵活,显式锁
* 注意:这是一个显示锁,需要通过lock()方法上锁,必须通过unlock()方法进行释放锁,
* 因此使用有风险(存在一定的安全隐患),因为是通过方法来释放锁,所以要注意释放,一般将unlock()方法放置finally中
*/
public class TestLock { public static void main(String[] args) {
Ticket ticket = new Ticket(); new Thread(ticket, "1号窗口").start();
new Thread(ticket, "2号窗口").start();
new Thread(ticket, "3号窗口").start();
}
} class Ticket implements Runnable {
private int tick = 100; private Lock lock = new ReentrantLock(); @Override
public void run() {
while(true) {
lock.lock();
try {
if (tick > 0) {
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " 完成售票,余票为:" + --tick);
}
} finally {
lock.unlock(); //释放锁
}
} }
}
最新文章
- 模拟搭建Web项目的真实运行环境(五)
- Git Commands Quick Notes
- ASP.NET MVC之持久化TempData及扩展方法(十三)
- MVC的基类
- 我理解的this
- SharePoint 列表的导出导入
- javaweb学习总结—Apache的DBUtils框架学习
- oracle过程中动态语句实现
- Spring+Mybatis+MySql+Maven 简单的事务管理案例
- 继承自CCObject的对象成员变量出错或者为空的问题
- Android 如何动态改变Actionbar上的item图标
- 【转载】HBase 数据库检索性能优化策略
- Ajax与C#应用详细实例
- highstaock+websocket实现动态展现
- MVC部署阿里云躺过的坑
- 把ajax包装成promise的形式(1)
- Gis数据处理2 ---8.18
- input光标大小
- Node.js ECONNREFUSED错误
- Java 使用命令对堆线程分析