博客
关于我
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学习总结(49)——从开发规范、选型、拆分到减压
查看>>
Mysql学习总结(4)——MySql基础知识、存储引擎与常用数据类型
查看>>
Mysql学习总结(50)——Oracle,mysql和SQL Server的区别
查看>>
Mysql学习总结(51)——Linux主机Mysql数据库自动备份
查看>>
Mysql学习总结(52)——最全面的MySQL 索引详解
查看>>
Mysql学习总结(53)——使用MySql开发的Java开发者规范
查看>>
Mysql学习总结(54)——MySQL 集群常用的几种高可用架构方案
查看>>
Mysql学习总结(55)——MySQL 语句大全再温习
查看>>
Mysql学习总结(56)——MySQL用户管理和权限设置
查看>>
Mysql学习总结(57)——MySQL查询当天、本周、本月、上周、本周、上月、距离当前现在6个月数据
查看>>
Mysql学习总结(58)——深入理解Mysql的四种隔离级别
查看>>
Mysql学习总结(59)——数据库分库分表策略总结
查看>>
Mysql学习总结(5)——MySql常用函数大全讲解
查看>>
Mysql学习总结(60)——并发量大、数据量大的互联网业务数据库设计规范总结
查看>>
Mysql学习总结(61)——MySQL优化之DBA级优化整理汇总
查看>>
Mysql学习总结(62)——MySQL连接com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link问题
查看>>
Mysql学习总结(63)——Mysql数据库架构方案选择与分析
查看>>
Mysql学习总结(64)——Mysql配置文件my.cnf各项参数解读
查看>>
Mysql学习总结(65)——项目实战中常用SQL实践总结
查看>>
Mysql学习总结(66)——设置MYSQL数据库编码为UTF-8
查看>>