多线程锁sync+lock使用,@Async使用

简介: 多线程锁sync+lock使用,@Async使用

线程安全问题

核心思想:上锁

线程安全性问题的代码才需要上锁,怎样才会出现线程安全问题?修改对象就会出现。

jvm中,多个线程竞争一把锁,最终只有一个能抢到,抢不到的中间需要经历锁升级的过程,如果一直没获取到锁就会一直阻塞等待。

解决线程安全问题方法:

1.使用synchronized锁,1.6之后锁的升级过程,偏向锁-轻量级锁-重量级锁

2.使用Lock锁,需要自己实现锁升级,AQS+CAS

3.使用ThreadLocal,注意内存泄漏问题,需要手动remove。

4.原子类CAS非阻塞式。

synchronized锁的用法:

1.修饰代码块,指定加锁对象

2.修饰实例方法,作用于当前实例加锁

3.修饰静态方法,作用于当前类对象加锁

synchronuzed加在实例方法 上和使用代码块用的都是this锁

加在静态方法上就是类锁


锁之间的通讯

wait(),notify(),需要放到sync代码块中使用。

如何设置线程执行顺序,可以使用Join(本质还是使用wait notify)

image.png

yield:主动释放cpu执行权,让线程从运行状态到就绪状态,让其他线程执行,底层是操作系统的调度器。

wait和sleep区别:

sleep是Thread类的,wait是Object类的。

sleep不释放锁(抱着锁睡觉),wait释放对象锁(sync的this锁)所以必须在sync中使用,而sleep不释放锁,所以在哪都可以使用。

wait和notify可能会出现虚假唤醒的问题,所以sync中出现if判断的话容易出问题,需要改成while循环使用

@Async注解

spring提供此注解以供异步使用,但是可能会失效,所以需要专门写一个异步类编写async方法,然后其他地方通过autowired去引用使用。

注意:这个注解相当于new Thread,每次调用都会创建新的线程,所以最好结合线程池使用。

整合线程池:

image.png

image.png

image.png

使用:

image.png

Lock

ReenTrantLock 默认非公平锁

与synchronized区别:

1.sync无法获取锁状态,lock可以判断是否获取到锁

2.sync自动释放锁,lock必须要手动释放,不释放就死锁

3.sync获取锁,会一直阻塞,lock不一定会一直等待

4.sync可重入,非公平,不可中断,lock可重入,非公平(可以设置成公平),可中断

5.sync适合少量代码块,lock适合大量代码

相关文章
|
2月前
|
并行计算 Java 数据处理
SpringBoot高级并发实践:自定义线程池与@Async异步调用深度解析
SpringBoot高级并发实践:自定义线程池与@Async异步调用深度解析
233 0
|
3月前
|
安全 Java 编译器
线程安全问题和锁
本文详细介绍了线程的状态及其转换,包括新建、就绪、等待、超时等待、阻塞和终止状态,并通过示例说明了各状态的特点。接着,文章深入探讨了线程安全问题,分析了多线程环境下变量修改引发的数据异常,并通过使用 `synchronized` 关键字和 `volatile` 解决内存可见性问题。最后,文章讲解了锁的概念,包括同步代码块、同步方法以及 `Lock` 接口,并讨论了死锁现象及其产生的原因与解决方案。
98 10
线程安全问题和锁
|
3月前
|
安全 Java 调度
Java编程时多线程操作单核服务器可以不加锁吗?
Java编程时多线程操作单核服务器可以不加锁吗?
50 2
|
28天前
|
供应链 安全 NoSQL
PHP 互斥锁:如何确保代码的线程安全?
在多线程和高并发环境中,确保代码段互斥执行至关重要。本文介绍了 PHP 互斥锁库 `wise-locksmith`,它提供多种锁机制(如文件锁、分布式锁等),有效解决线程安全问题,特别适用于电商平台库存管理等场景。通过 Composer 安装后,开发者可以利用该库确保在高并发下数据的一致性和安全性。
38 6
|
1月前
|
Java 开发者
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
47 4
|
2月前
|
Java 开发者
在 Java 多线程编程中,Lock 接口正逐渐取代传统的 `synchronized` 关键字,成为高手们的首选
【10月更文挑战第6天】在 Java 多线程编程中,Lock 接口正逐渐取代传统的 `synchronized` 关键字,成为高手们的首选。相比 `synchronized`,Lock 提供了更灵活强大的线程同步机制,包括可中断等待、超时等待、重入锁及读写锁等高级特性,极大提升了多线程应用的性能和可靠性。通过示例对比,可以看出 Lock 接口通过 `lock()` 和 `unlock()` 明确管理锁的获取和释放,避免死锁风险,并支持公平锁选择和条件变量,使其在高并发场景下更具优势。掌握 Lock 接口将助力开发者构建更高效、可靠的多线程应用。
31 2
|
3月前
|
存储 缓存 安全
【Java面试题汇总】多线程、JUC、锁篇(2023版)
线程和进程的区别、CAS的ABA问题、AQS、哪些地方使用了CAS、怎么保证线程安全、线程同步方式、synchronized的用法及原理、Lock、volatile、线程的六个状态、ThreadLocal、线程通信方式、创建方式、两种创建线程池的方法、线程池设置合适的线程数、线程安全的集合?ConcurrentHashMap、JUC
|
2月前
|
运维 API 计算机视觉
深度解密协程锁、信号量以及线程锁的实现原理
深度解密协程锁、信号量以及线程锁的实现原理
49 2
|
3月前
|
Java
领略Lock接口的风采,通过实战演练,让你迅速掌握这门高深武艺,成为Java多线程领域的武林盟主
领略Lock接口的风采,通过实战演练,让你迅速掌握这门高深武艺,成为Java多线程领域的武林盟主
42 7
|
2月前
|
Java 应用服务中间件 测试技术
Java21虚拟线程:我的锁去哪儿了?
【10月更文挑战第8天】
47 0