zoukankan      html  css  js  c++  java
  • 多线程详解2:并发

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

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

      synchronized  锁 

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

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

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

    同步块:锁具体的对象

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

    尽可能锁定合理的范围

    CopyOnWriteArrayList   并发容器

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

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

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

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

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

    wait 线程一直等待 会释放锁  

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

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

    管程法

           缓冲区:容器+计数器

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

    信号灯法

           标志位:需要修改标志位

    补充:

    HappenBefore 指令重排

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

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

    解决方法:volatile 轻量的 synchronized

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

    DCL单例模式

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

     

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

    加版本号 比较并交换 

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

  • 相关阅读:
    MySQL-percona安装
    Oracle-19C PSU升级
    Oracle-内存管理机制
    学习进度第十二周
    十天冲刺10
    单词统计续
    十天冲刺9
    学习进度第十一周
    十天冲刺8
    十天冲刺7
  • 原文地址:https://www.cnblogs.com/yxj808/p/15184839.html
Copyright © 2011-2022 走看看