多线程详解2:并发
并发:同一个对象多个线程同时操作 对数据存在修改的情况需要保证数据的正确和安全
线程同步:多线程进入这个对象的等待池 形成队列,对象加上锁
synchronized 锁
引起的问题:性能问题,会比较慢
具体实现: 成员方法锁this 静态方法锁class
同步方法:锁的是当前对象
同步块:锁具体的对象
synchronized(obj){} obj被称之为同步监视器
尽可能锁定合理的范围
CopyOnWriteArrayList 并发容器
死锁:过多的同步可能会造成相互不释放资源
多个线程各自占有一些共享资源,并且互相等待一些其他线程共享资源才能进行
不要在同一个代码块 互相持有多个对象的锁
并发协作 :生产者消费者模式 线程通信
服务层 应用层交互 进行解耦
wait 线程一直等待 会释放锁
notify 唤醒一个等待状态的线程
notifiyAll 唤醒同一个对象上所有调用wait的线程
管程法
缓冲区:容器+计数器
需要判断何时消费 何时生产
信号灯法
标志位:需要修改标志位
补充:
HappenBefore 指令重排
执行代码的顺序可能与编写代码不一致 虚拟机优化代码顺序 指令重排
有数据依赖性 不会重排
指令重排 :代码执行顺序与预期不一致
解决方法:volatile 轻量的 synchronized
保证线程间变量的可见性 提高执行效率 不能保证原子性
DCL单例模式
ThreadLocal
在多线程环境下,每个线程都有自己的数据
CAS:比较并交换 很高效的解决原子操作 AtomicInteger
乐观锁 :失败就重试
加版本号 比较并交换
比较版本号 相同 修改,不同则无法修改