ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

01-并发编程之深入理解JMM并发三大特性(一)【并发编程 TL 01】

01-并发编程之深入理解JMM并发三大特性(一)【并发编程 TL 01】 并发理论基础原子性、有序性、可见性上下文切换、活跃性问题、死锁问题、线程安全问题volatile保证有序性、可见性juc包下类本质是等待唤醒机制 wait与notify、sleep底层都是 park与unpark 等待唤醒机制 调用操作系统的库函数linux调用pthread_cond_timedwait写出来的程序正确的在cpu上运行、高效充分的压榨硬件的性能比如充分的压榨cpu的计算能力以及充分地压榨IO读写的能力、安全怎样去压榨需要了解硬件的工作原理内存之间如何交互数据、线程之间如何进行通信的、需要了解底层的一些模型目标理解并发的三大特性、jvm工作内存与主内存的关系知道多线程之间如何通信的掌握volatile能保证可见性和有序性掌握cas管程monitor synchronized、lockconditionreentrantlock并发编程就是解决线程与线程之间如何同步的线程之间存在依赖关系、协作 浏览器发送请求到tomcattomcat请求数据库、如何互斥的共享资源只能我这个线程使用其他线程得等到我释放这个资源才能使用、如何分工的计算一个很大数组的和 10亿大任务拆分为小的任务最后再做合并。解决线程之间的协作问题解决活跃性问题、死锁问题、线程安全问题库存超卖内存模型与线程间通信有关 共享内存模型主内存和工作内存这期间可能出现线程安全问题无锁机制解决方案、有锁机制synchronized、lock(基于AQS同步器的ReentrantLock、ReentrantReadWritelock与Stampedlock ) 解决方案并发工具类atomic包下原子类、线程池ThreadPoolExecutor、ScheduledThreadPoolExecutor、线程协作semaphore用来做限流、Exchanger用来交互数据、CountDownLatch用来模拟并发、并发容器将任务丢到队列里面安排一个线程去处理、future异步方式、Fork/join分工的、Disruptor高性能队列并发设计模式线程对操作系统来说是一种很重的资源需要切换到内核态去调用系统函数才能创建线程。线程占用内存并发与并行并发在宏观上看不出来、在微观上是交替执行的单核场景下也可以存在。并行是实际存在的物理架构宏观微观都是可以指令同时运行。目标都是最大化cpu的使用率Thread.yield() 释放时间片会发生上下文切换 会还原现场 会加载上下文加载到flagtruevolatilejvm层面 storeload内存屏障 -- (汇编层面指令) lock;addl $0,0(%%rsp) lock前缀指令立即刷回主内存缓存失效 lock前缀指令不是内存屏障的指令但是有内存屏障的效果。保证处理器其他副本失效。缓存失效有序性的目的是保证可见性UnsafeFactory.getUnsafe().storeFence();同上synchronized调用storefence 内存屏障LockSupport.unpark(Thread.currentThread) 同上Thread.sleep(1)内存屏障Integerfinal保证可见性 private final int value; 通过final关键字 保证可见性总结java中的可见性是如何保证的方式有两种1、内存屏障storeload();--》x86 lock替代了mfence内存屏障可以禁止重排序。2、上下文切换如何充分压榨硬件资源 压榨cpu计算能力减少cpu等待时间机械同感当前线程对共享变量的操作会存在读不到或者不能立即读到另一个线程对此变量的写操作实现javavolatile 锁do while不可以 和while可以-Xint可以
返回列表