做网站网站会怎么样,全国高校校园网站联盟建设,微信网站流程,中国室内设计公司核心问题#xff1a;分工#xff0c;同步#xff0c;互斥 分工#xff1a;如何高效地拆解任务并分配给线程 生产者-消费者模式、Thread-Per-Message模式、Worker-Thread模式、ComplateableFuture和CompletionServiceJava SDK 并发包里的 Executor、Fork/Join、Future 本质上… 核心问题分工同步互斥 分工如何高效地拆解任务并分配给线程 生产者-消费者模式、Thread-Per-Message模式、Worker-Thread模式、ComplateableFuture和CompletionServiceJava SDK 并发包里的 Executor、Fork/Join、Future 本质上都是一种分工方法同步线程之间如何协作 一个线程执行完了一个任务如何通知执行后续任务的线程开工Java SDK 里提供的 CountDownLatch、CyclicBarrier、Phaser、Exchanger互斥保证同一时刻只允许一个线程访问共享资源 导致不确定的主要源头是可见性问题、有序性问题和原子性问题Java SDK 里提供的 ReadWriteLock、StampedLock 可以优化读多写少场景下锁的性能 可见性、原子性和有序性问题 可见性一个线程对共享变量的修改另外一个线程能够立刻看到原子性我们把一个或者多个操作在 CPU 执行的过程中不被中断的特性称为原子性有序性Java内存模型中允许编译器和处理器对指令进行重排序但是重排序过程不会影响到单线程程序的执行却会影响到多线程并发执行的正确性。缓存导致的可见性问题当多个线程在不同的 CPU 上修改同一个变量时因为多个线程不是同时启动的有一个时差可能会导致值不一样。线程切换带来的原子性问题 首先将变量从内存中加载到CPU寄存器之后执行操作最终将结果写入内存缓存机制导致可能写入的是CPU缓存而不是内存单例模式的双重检测new指令也是3步操作①分内存②初始化③赋值给引用变量可能会发生①③②的重排序这时候如果又有操作系统的分时操作的加持导致A操作①③后挂起时间片被分配给了B线程而B线程甚至都不需要进行锁的获取因为此时instance已经不等于null了但是此时的instance可能未初始化