一、并发编程出现的问题:

1. 可见性问题

在这里插入图片描述

在这里插入图片描述
一个线程正在执行操作,然后另一个线程对其值进行修改,但是第一个线程并不能及时看到修改后的值。就出现了可见性问题。

2. 原子性问题(多个线程、有共享变量)

在这里插入图片描述
在这里插入图片描述
i++并不是原子性操作。
比如说做自增操作,自增操作并不是一个原子性操作,当多个线程同时执行的时候,就会出现问题,导致结果不正确

3. 有序性问题

程序中代码的执行顺序,java会在编译和运行时会对代码进行优化,导致程序最终执行顺序不一定就是我们编写代码时的顺序。

二、Synchronized特性:

1. 原子性

2. 可见性

一个线程对共享变量进行修改,另外一个线程立即得到修改后的最新值

3. 有序性

4. 可重入性

在这里插入图片描述
在这里插入图片描述

5. 不可中断性

在这里插入图片描述
在这里插入图片描述

sunchronized和lock的区别

在这里插入图片描述

ReentrantLock

在这里插入图片描述
在这里插入图片描述

三、CAS

在这里插入图片描述

在这里插入图片描述

四、锁优化

1. 偏向锁

适用于一个线程反复进入同步代码块

一个线程反复进入同步代码块,锁就偏向他。如果有线程竞争,就要撤销该锁,升级为轻量级锁。

2. 轻量级锁

适用于多线程交替执行同步块的情况。

在特定情况下可以节省性能消耗。
在这里插入图片描述

3. 自旋锁:不转换线程状态,多做几次尝试

当一个线程拿到锁执行同步代码块的时候,其他线程就会被阻塞,但是同步代码块里面执行的代码有可能会很快。但是别的线程状态转换的开销太大,耗费多余的资源。此时就让她重试几次。

4. 重量级锁:阻塞和唤醒

线程的阻塞和唤醒需要CPU从用户态转换为核心态,给系统的并发性能带来很大压力。

五、平时写代码如何对synchronized优化

降低锁的粒度,比如不要把…class作为锁。
在这里插入图片描述
hashtable的增删改查的方法上全加上了Synchronized锁,
在这里插入图片描述
在这里插入图片描述

六、锁的分类

在这里插入图片描述

1. 乐观锁和悲观锁

在这里插入图片描述

2.行级锁、表级锁、页级锁

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值