synchronized 与 Lock

el/2024/2/25 23:54:58

Synchronized 和 Lock 区别
1、Synchronized 内置的Java关键字, Lock 是一个Java类
2、Synchronized 无法判断获取锁的状态,Lock 可以判断是否获取到了锁
3、Synchronized 会自动释放锁,lock 必须要手动释放锁!如果不释放锁,死锁
4、Synchronized 线程 1(获得锁,阻塞)、线程2(等待,傻傻的等);Lock锁就不一定会等待下去;
5、Synchronized 可重入锁,不可以中断的,非公平;Lock ,可重入锁,可以 判断锁,非公平(可以自己设置);
6、Synchronized 适合锁少量的代码同步问题,Lock 适合锁大量的同步代码!

synchronized:锁实现:

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;class test1{public static void main(String[] args) {Ticket t = new Ticket();new Thread(()->{for (int i = 0; i < 40; i++) {t.saleTicket();}},"a").start();new Thread(()->{for (int i = 0; i < 40; i++) {t.saleTicket();}},"b").start();new Thread(()->{for (int i = 0; i < 40; i++) {t.saleTicket();}},"c").start();}}class Ticket{private int num = 30;public synchronized void saleTicket(){if(num>0){System.out.println(Thread.currentThread().getName()+"卖出了"+num--+"票,还剩"+num+"票");}}
}

Lock:锁实现:

Lock lock = new ReentrantLock();// 无参的表示生成的锁是非公平锁
public ReentrantLock() {this.sync = new ReentrantLock.NonfairSync();}public ReentrantLock(boolean var1) {this.sync = (ReentrantLock.Sync)(var1 ? new ReentrantLock.FairSync() : new ReentrantLock.NonfairSync());}
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;class test1{public static void main(String[] args) {Ticket t = new Ticket();new Thread(()->{ for (int i = 0; i < 40; i++) { t.saleTicket(); } },"a").start();new Thread(()->{ for (int i = 0; i < 40; i++) { t.saleTicket(); } },"b").start();new Thread(()->{ for (int i = 0; i < 40; i++) { t.saleTicket(); } },"c").start();}}// Lock三部曲
// 1、 new ReentrantLock();
// 2、 lock.lock(); // 加锁
// 3、 finally=>lock.unlock(); // 解锁
class Ticket{private int num = 30;Lock lock = new ReentrantLock();public  void saleTicket(){lock.lock();try {if(num>0){System.out.println(Thread.currentThread().getName()+"卖出了"+num--+"票,还剩"+num+"票");}} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();}}
}

 


http://www.ngui.cc/el/4893739.html

相关文章

集合类-多线程下不安全及其解决办法

1 List 不安全 import java.util.*; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock;…

四大函数式接口(必需掌握)

新时代的程序员: lambda表达式、链式编程、函数式接口、Stream流式计算 1. 函数式接口: 只有一个方法的接口 @FunctionalInterface public interface Runnable {void run(); }// 简化编程模型,在新版本的框架底层大量应用! 只要是 函数型接口 就可以 用 lambda表达式简化: …

ForkJoin与Stream并行流

ForkJoin 在 JDK 1.7 , 并行执行任务!提高效率。大数据量! ForkJoin 特点:工作窃取 这个里面维护的都是双端队列 以下计算1-10_0000_0000的和,for循环与ForkJoin效率差别不大,但是使用Stream并行流效果显著!!! import java.util.*; import java.util.concurrent.Executi…

Volatile-内存屏障

Java 中如何保证底层操作的有序性和可见性&#xff1f;可以通过内存屏障。 内存屏障是被插入两个 CPU 指令之间的一种指令&#xff0c;用来禁止处理器指令发生重排序&#xff08;像屏障一样&#xff09;&#xff0c;从而保障有序性的。 另外&#xff0c;为了达到屏障的效果&a…

单例模式安全之反射攻击

单例模式这里就不谈了&#xff0c;什么是单例模式可参考七种Java单例模式详解,这里是关于单例模式安全方面的&#xff0c;当然了这里说的安全不是线程安全。 什么是反射攻击呢 在Java中&#xff0c;由于反射的功能实在是太强了&#xff0c;通过动态访问类并设置Access(如setA…

ubuntu 解决优盘文件 read-only file system 问题

1.进入root: sudo su2.显示分区&#xff1a; df -Th 结果如下&#xff1a; Filesystem Type Size Used Avail Use% Mounted on udev devtmpfs 3.8G 0 3.8G 0% /dev tmpfs tmpfs 784M 9.5M 775M 2% /run /dev/sdb2 ext4 …

Mybatis Mapper接口是如何找到实现类的-源码分析

转载自:https://www.cnblogs.com/demingblog/p/9544774.html KeyWords: Mybatis 原理,源码,Mybatis Mapper 接口实现类,代理模式,动态代理,Java动态理,Proxy.newProxyInstance,Mapper 映射,Mapper 实现 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程…

HikariCP连接池监控

Spring-Boot-2.0.0-M1 版本将默认的数据库连接池从tomcat jdbc pool改为了hikari&#xff0c;通过HikariCP可以分析慢查询是什么导致的&#xff01;

springboot—spring aop 实现系统操作日志记录存储到数据库

采用方案&#xff1a; 使用spring 的 aop 技术切到自定义注解上&#xff0c;针对不同注解标志进行参数解析&#xff0c;记录日志 缺点&#xff1a;要针对每个不同的注解标志进行分别取注解标志&#xff0c;获取参数进行日志记录输出 1. 需要引用的依赖 <!--spring切面aop依…

在 Ubuntu 16.04 上安装 Vagrant

本文引用自:https://yq.aliyun.com/articles/763504 Vagrant是一个命令行工具,用于构建和管理虚拟开发环境。 默认情况下,Vagrant 在 VirtualBox, Hyper-V, 和 Docker 之上准备环境。支持其他提供者,例如, Libvirt (KVM), VMware and AWS 可以通过 Vagrant 插件系统启用…