多线程详解2:并发

并发:同一个对象多个线程同时操作  对数据存在修改的情况需要保证数据的正确和安全

线程同步:多线程进入这个对象的等待池 形成队列,对象加上锁

  synchronized  锁 

 引起的问题:性能问题,会比较慢

 

 具体实现: 成员方法锁this 静态方法锁class

同步方法:锁的是当前对象 

同步块:锁具体的对象

synchronized(obj){} obj被称之为同步监视器 

尽可能锁定合理的范围

 

CopyOnWriteArrayList   并发容器

 

死锁:过多的同步可能会造成相互不释放资源

多个线程各自占有一些共享资源,并且互相等待一些其他线程共享资源才能进行

不要在同一个代码块 互相持有多个对象的锁

 

并发协作 :生产者消费者模式   线程通信

服务层 应用层交互  进行解耦

wait 线程一直等待 会释放锁  

notify 唤醒一个等待状态的线程

notifiyAll 唤醒同一个对象上所有调用wait的线程

管程法

       缓冲区:容器+计数器

        需要判断何时消费  何时生产

信号灯法

       标志位:需要修改标志位

 

补充:

HappenBefore 指令重排

执行代码的顺序可能与编写代码不一致 虚拟机优化代码顺序 指令重排
有数据依赖性 不会重排

指令重排 :代码执行顺序与预期不一致

解决方法:volatile 轻量的 synchronized

保证线程间变量的可见性   提高执行效率 不能保证原子性

 

DCL单例模式

 

ThreadLocal
在多线程环境下,每个线程都有自己的数据

 

CAS:比较并交换   很高效的解决原子操作   AtomicInteger  
乐观锁 :失败就重试

加版本号 比较并交换 

比较版本号 相同 修改,不同则无法修改   

posted @ 2021-08-25 14:23  下饭  阅读(51)  评论(0编辑  收藏  举报