用于解决多线程安全问题有三种方式:

  • 同步代码块(隐式锁,基于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(); //释放锁
}
} }
}

最新文章

  1. 模拟搭建Web项目的真实运行环境(五)
  2. Git Commands Quick Notes
  3. ASP.NET MVC之持久化TempData及扩展方法(十三)
  4. MVC的基类
  5. 我理解的this
  6. SharePoint 列表的导出导入
  7. javaweb学习总结—Apache的DBUtils框架学习
  8. oracle过程中动态语句实现
  9. Spring+Mybatis+MySql+Maven 简单的事务管理案例
  10. 继承自CCObject的对象成员变量出错或者为空的问题
  11. Android 如何动态改变Actionbar上的item图标
  12. 【转载】HBase 数据库检索性能优化策略
  13. Ajax与C#应用详细实例
  14. highstaock+websocket实现动态展现
  15. MVC部署阿里云躺过的坑
  16. 把ajax包装成promise的形式(1)
  17. Gis数据处理2 ---8.18
  18. input光标大小
  19. Node.js ECONNREFUSED错误
  20. Java 使用命令对堆线程分析

热门文章

  1. IISExpress 站点信息
  2. idea新建的项目,文件夹右键不能新建class
  3. sift算法特征点如何匹配?
  4. 20144303石宇森 《Java程序设计》第2周学习总结
  5. java处理json的工具类(list,map和json的之间的转换)
  6. Labview 查看一次while循环运行的时间
  7. .NET中常见的锁 笔记
  8. mysql创建数据库和用户
  9. Sqoop-问题
  10. HDFS读写流程learning