博客
关于我
java线程(17)——Lock锁,三个线程抢票加上lock锁后变成三个线程排队买票
阅读量:322 次
发布时间:2019-03-04

本文共 1939 字,大约阅读时间需要 6 分钟。

1.三个线程同时抢票导致线程不安全

不安全的代码

//测试Lock锁public class TestLock {       public static void main(String[] args) {           Testlock2 testlock2 = new Testlock2();        new Thread(testlock2).start();        new Thread(testlock2).start();        new Thread(testlock2).start();    }}class Testlock2 implements Runnable {       int ticketNums = 10;    //定义lock锁    private final ReentrantLock lock = new ReentrantLock();    @Override    public void run() {           while (true) {               if (ticketNums > 0) {                   try {                       Thread.sleep(1000);                } catch (InterruptedException e) {                       e.printStackTrace();                }                System.out.println(ticketNums--);            } else break;        }    }}

三个线程同时访问票,容易出现线程安全问题

运行结果
在这里插入图片描述

2.加上Lock锁后

代码

import java.util.concurrent.locks.ReentrantLock;//测试Lock锁public class TestLock {       public static void main(String[] args) {           Testlock2 testlock2 = new Testlock2();        new Thread(testlock2).start();        new Thread(testlock2).start();        new Thread(testlock2).start();    }}class Testlock2 implements Runnable{       int ticketNums = 10;    //定义lock锁    private final ReentrantLock lock = new ReentrantLock();    @Override    public void run() {           while (true){           	//加锁            lock.lock();            try {                   if (ticketNums>0){                       try {                           Thread.sleep(1000);                    } catch (InterruptedException e) {                           e.printStackTrace();                    }                    System.out.println(ticketNums--);                }                else break;            }finally {                   //解锁                lock.unlock();            }        }    }}

运行结果

在这里插入图片描述

3.Lock锁与synchronized的对比

  1. lock是显示锁(手动开启和关闭锁,别忘记关闭锁),synchronized是隐式锁,出了作用域自动释放
  2. lock只有代码块锁,synchronized有代码块锁和方法锁
  3. 使用lock锁,JVM将花费较少的时间来调度线程(性能更好)

转载地址:http://zseq.baihongyu.com/

你可能感兴趣的文章
mysql 断电数据损坏,无法启动
查看>>
MySQL 日期时间类型的选择
查看>>
Mysql 时间操作(当天,昨天,7天,30天,半年,全年,季度)
查看>>
MySQL 是如何加锁的?
查看>>
MySQL 是怎样运行的 - InnoDB数据页结构
查看>>
mysql 更新子表_mysql 在update中实现子查询的方式
查看>>
MySQL 有什么优点?
查看>>
mysql 权限整理记录
查看>>
mysql 权限登录问题:ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)
查看>>
MYSQL 查看最大连接数和修改最大连接数
查看>>
MySQL 查看有哪些表
查看>>
mysql 查看锁_阿里/美团/字节面试官必问的Mysql锁机制,你真的明白吗
查看>>
MySql 查询以逗号分隔的字符串的方法(正则)
查看>>
MySQL 查询优化:提速查询效率的13大秘籍(避免使用SELECT 、分页查询的优化、合理使用连接、子查询的优化)(上)
查看>>
mysql 查询,正数降序排序,负数升序排序
查看>>
MySQL 树形结构 根据指定节点 获取其下属的所有子节点(包含路径上的枝干节点和叶子节点)...
查看>>
mysql 死锁 Deadlock found when trying to get lock; try restarting transaction
查看>>
mysql 死锁(先delete 后insert)日志分析
查看>>
MySQL 死锁了,怎么办?
查看>>
MySQL 深度分页性能急剧下降,该如何优化?
查看>>