多线程锁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适合大量代码

相关文章
|
16天前
|
Java 开发者
解锁并发编程新姿势!深度揭秘AQS独占锁&ReentrantLock重入锁奥秘,Condition条件变量让你玩转线程协作,秒变并发大神!
【8月更文挑战第4天】AQS是Java并发编程的核心框架,为锁和同步器提供基础结构。ReentrantLock基于AQS实现可重入互斥锁,比`synchronized`更灵活,支持可中断锁获取及超时控制。通过维护计数器实现锁的重入性。Condition接口允许ReentrantLock创建多个条件变量,支持细粒度线程协作,超越了传统`wait`/`notify`机制,助力开发者构建高效可靠的并发应用。
36 0
|
5天前
|
算法 Java
JUC(1)线程和进程、并发和并行、线程的状态、lock锁、生产者和消费者问题
该博客文章综合介绍了Java并发编程的基础知识,包括线程与进程的区别、并发与并行的概念、线程的生命周期状态、`sleep`与`wait`方法的差异、`Lock`接口及其实现类与`synchronized`关键字的对比,以及生产者和消费者问题的解决方案和使用`Condition`对象替代`synchronized`关键字的方法。
JUC(1)线程和进程、并发和并行、线程的状态、lock锁、生产者和消费者问题
|
11天前
|
安全 算法 Java
17 Java多线程(线程创建+线程状态+线程安全+死锁+线程池+Lock接口+线程安全集合)(下)
17 Java多线程(线程创建+线程状态+线程安全+死锁+线程池+Lock接口+线程安全集合)
51 6
|
12天前
|
存储 安全 Java
17 Java多线程(线程创建+线程状态+线程安全+死锁+线程池+Lock接口+线程安全集合)(中)
17 Java多线程(线程创建+线程状态+线程安全+死锁+线程池+Lock接口+线程安全集合)
53 5
|
12天前
|
存储 安全 Java
17 Java多线程(线程创建+线程状态+线程安全+死锁+线程池+Lock接口+线程安全集合)(上)
17 Java多线程(线程创建+线程状态+线程安全+死锁+线程池+Lock接口+线程安全集合)
46 3
|
27天前
|
算法 Java 编译器
多线程线程安全问题之系统层面的锁优化有哪些常见的策略
多线程线程安全问题之系统层面的锁优化有哪些常见的策略
|
27天前
|
安全 云计算
云计算自旋锁问题之在线程安全地删除链表节点时,需要频繁加锁会影响性能如何解决
云计算自旋锁问题之在线程安全地删除链表节点时,需要频繁加锁会影响性能如何解决
29 2
|
5天前
|
编译器 C语言 iOS开发
iOS 16 系统键盘修复问题之确定_lock是否用于保护对_deferredTasks的多线程读写如何解决
iOS 16 系统键盘修复问题之确定_lock是否用于保护对_deferredTasks的多线程读写如何解决
|
27天前
|
Java
多线程线程安全问题之什么是锁的粒度,减少锁的粒度有哪些好处
多线程线程安全问题之什么是锁的粒度,减少锁的粒度有哪些好处
|
27天前
多线程线程安全问题之synchronized和ReentrantLock在锁的释放上有何不同
多线程线程安全问题之synchronized和ReentrantLock在锁的释放上有何不同