12、synchronized和Lock的使用
1、多并发案例:
一个车站有三个窗口同时卖30张票,每个窗口都有40个人在排队买票,在多线程情况下,不加锁,线程不安全,导致卖票不准确
package com.example.Lock; /**
* 线程就是一个单独的资源类,没有任何附属的操作
*/
public class demo1 {
public static void main( String[] args )
{
//并发:多线程操作同一个资源类,把资源类丢入线程
Ticket ticket = new Ticket(); new Thread(() -> {
for(int i=0;i<40;i++){
ticket.sale();
}
},"A窗口").start(); new Thread(() -> {
for(int i=0;i<40;i++){
ticket.sale();
}
},"B窗口").start(); new Thread(() -> {
for(int i=0;i<40;i++){
ticket.sale();
}
},"c窗口").start();
}
} /**
* 资源类
*/
class Ticket{ //总票数
private int number = 30; //卖票
public void sale(){
if(number>0){
System.out.println(Thread.currentThread().getName()+"卖出了第"+(number--)+"张票,剩余: "+number);
}
}
}
2、使用锁:
解决上面的线程不安全的问题,可以通过加锁的方式
(1)、方式一:synchronized关键字
使用synchronized,在卖票的方法加synchronized关键字,表示对是整个方法范围内对当前对象的加锁
//卖票
public synchronized void sale(){
if(number>0){
System.out.println(Thread.currentThread().getName()+"卖出了第"+(number--)+"张票,剩余: "+number);
}
}
(2)、方式二:Lock接口
使用Lock,一共三步
——》创建锁
——》加锁
——》解锁
/**
* 资源类
*/
class Ticket{ //总票数
private int number = 30; //创建锁
Lock lock = new ReentrantLock(); //卖票
public void sale(){ //加锁
lock.lock(); try {
if(number>0){
System.out.println(Thread.currentThread().getName()+"卖出了第"+(number--)+"张票,剩余: "+number);
}
} catch (Exception e) { }finally{
//解锁
lock.unlock();
} }
}
3、synchronized和Lock的区别:
(1)、synchronized是内置的Java关键字;Lock是一个接口
(2)、synchronized无法判断获取锁的状态;Lock可以
(3)、synchronized会自动释放锁;Lock必须手动释放锁,如果不释放,就会出现死锁
(4)、synchronized多个线程获取同一个锁,其中一个线程已经获取锁,但发生阻塞,其他线程就会一直等待;Lock不一定等待下去
(5)、synchronized是可重入锁,不可以中断的,非公平;Lock也是可重入锁,可以判断锁,默认非公平(可以设置公平)
(6)、synchronized适合锁少量代码同步;Lock适合锁大量同步代码
搜索
复制
12、synchronized和Lock的使用的更多相关文章
- 线程安全、数据同步之 synchronized 与 Lock
本文Demo下载传送门 写在前面 本篇文章讲的东西都是Android开源网络框架NoHttp的核心点,当然线程.多线程.数据安全这是Java中就有的,为了运行快我们用一个Java项目来讲解. 为什么要 ...
- 转:synchronized和LOCK的实现原理---深入JVM锁机制
JVM底层又是如何实现synchronized的? 目前在Java中存在两种锁机制:synchronized和Lock,Lock接口及其实现类是JDK5增加的内容,其作者是大名鼎鼎的并发专家Doug ...
- JAVA中synchronized和lock详解
目前在Java中存在两种锁机制:synchronized和Lock,Lock接口及其实现类是JDK5增加的内容,其作者是大名鼎鼎的并发专家Doug Lea.本文并不比较synchronize ...
- Java synchronized和 Lock 的区别与用法
在分布式开发中,锁是线程控制的重要途径.Java为此也提供了2种锁机制,synchronized和lock.做为Java爱好者,自然少不了对比一下这2种机制,也能从中学到些分布式开发需要注意的地方. ...
- 关于synchronized和Lock
原文链接:关于volatile关键字解析,synchronized和Lock参考 深入浅出,解释的非常清楚,有条理~~~ 以下为转载内容: Java并发编程:volatile关键字解析 volatil ...
- 【转载】synchronized 与 Lock 的那点事
最近在做一个监控系统,该系统主要包括对数据实时分析和存储两个部分,由于并发量比较高,所以不可避免的使用到了一些并发的知识.为了实现这些要求,后台使用一个队列作为缓存,对于请求只管往缓存里写数据.同时启 ...
- synchronized 与 Lock 的那点事
最近在做一个监控系统,该系统主要包括对数据实时分析和存储两个部分,由于并发量比较高,所以不可避免的使用到了一些并发的知识.为了实现这些要求,后台使用一个队列作为缓存,对于请求只管往缓存里写数据.同时启 ...
- Java多线程编程(四)—浅谈synchronized与lock
一.共享资源竞争问题 在Java语言的并发编程中,由于我们不知道线程实际上在何时运行,所以在实际多线程编程中,如果两个线程访问相同的资源,那么由于线程运行的不确定性便会在这种多线程中产生访问错误.所以 ...
- synchronized和lock比对
前言:在上面的博客说了synchronized的一些用法,下面我们再来看看lock,这个出现频率也是非常高的一个. 1:获取Lock锁的几种方式 前面说了synchronized有锁对象和锁类对象,当 ...
随机推荐
- Vue中生成UUID
<template> <div :id="elId" class="container"> <a>{{elId}}</ ...
- 【Java8新特性】- Lambda表达式
Java8新特性 - Lambda表达式 生命不息,写作不止 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学习成长! ...
- P8548 小挖的买花 方法记录
原题链接 小挖的买花 题目背景 小挖喜欢买花,但是 ta 太懒了!所以这个任务全权交给了你. 题目描述 花店里只有 \(n\) 株花,每一株花都有三个属性:价格 \(cost_i\).美丽度 \(be ...
- linux 自动备份mysql数据库
今天一早打开服务器.13W个木马.被爆破成功2次,漏洞3个.数据库被删.这是个悲伤的经历 还好之前有备份,服务器也升级了安全机制,只是备份是上个月的备份.所以想写个脚本,试试自动备份数据库. 1. 先 ...
- springboot+mybatis+shiro项目中使用shiro实现登录用户的权限验证。权限表、角色表、用户表。从不同的表中收集用户的权限、
要实现的目的:根据登录用户.查询出当前用户具有的所有权限.然后登录系统后.根据查询到的权限信息进行不同的操作. 以下的代码是在搭好的框架之下进行的编码. 文章目录 核心实现部分. 第一种是将用户表和角 ...
- Java多线程(4):ThreadLocal
您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来- 为了提高CPU的利用率,工程师们创造了多线程.但是线程们说:要有光!(为了减少线程创建(T1启动)和销毁(T3切换)的时间),于是工程师们又接着 ...
- Istio(十一):向istio服务网格中引入虚拟机
目录 一.模块概览 二.系统环境 三.虚拟机负载 3.1 虚拟机负载 3.2 单网络架构 3.3 多网络架构 3.4 Istio 中如何表示虚拟机工作负载? 四.实战:向istio Mesh中引入虚拟 ...
- 最全iOS 上架指南
一.上架基本需求资料 1.苹果开发者账号(公司已有可以不用申请,需要开通开发者功能,每年 99 美元) 2.开发好的APP 二.证书 上架版本需要使用正式的证书 1.创建证书 Apple Develo ...
- vim常用快捷键总结一(光标移动命令)
vim编辑器的工作模式分为3种即(命令模式,编辑模式和尾行模式),具体定义这里就不在赘述了,这里只简单介绍各工作模式下对应的操作和快捷方式. 通常来说三三种模式功能划分大致如下 命令模式:定位.翻页. ...
- Day16异常1
package com.exception.demo01;public class demo01 { public static void main(String[] args) { try{new ...