JUC 进阶成神系列
文章平均质量分 81
并发涵盖了在 Java 平台上的进程、线程、并发和并行。
七七鸽
无
展开
-
JUC 进阶成神系列08—共享模型之无锁
线程保证volatile变量都是直接操作主存,即一个线程对volatile变量的修改,对另一个线程可见。如果没有,虽然不会进入阻塞,但由于没有分到时间片,仍然会进入可运行状态,还会导致上下文切换,因此CAS需要多核CPU才能发挥优势,才能不发生上下文切换。过程中将A改成B,再将B改成A,再将A改成C。无锁情况下,即使重试失败,线程始终在高速运行没有停歇,而synchronized会让线程在没有获得锁的时候,发生上下文切换进入阻塞。的思想:最乐观的估计,不怕别的线程来修改共享变量,就算改了也没关系,再重试。原创 2024-03-14 17:37:28 · 327 阅读 · 0 评论 -
JUC 进阶成神系列07—共享模型之内存
Clock Cycle Time(cpu 的时钟周期时间),等于主频的倒数,是 cpu 能识别的最小时间单位,比如 4G 主频的 cpu 的 Clock Cycle Time 就是 0.25ns,作为对比,我们墙上挂钟的 Cycle time 是 1s。例如,运行一条加法指令一般需要一个时钟周期时间。线程对volatile变量的写(写入主存中,读写操作都是以主存中去读),对接下来其他线程对该变量的读可见。线程start前对变量的写,对该线程开始后(线程还没启动写入的变量,在线程启动以后)对该变量的读可见。原创 2024-03-14 17:20:03 · 287 阅读 · 0 评论 -
JUC进阶成神系列06—线程安全之ReentrantLock
try 块写的是要保护的临界区的代码,finally 块是为了将来无论有没有出现异常都能正确释放对象的锁,释放锁就是调用 unlock 方法。默认的 synchronized 和 ReentrantLock 的 Lock 方法也好,它们都是不可打断的,这种情况别人持有锁,我需要获得锁,就需要一直等待下去。本意是为了解决饥饿问题,但没必要,后面讲源码再细讲。比如哲学家就餐问题,一人一只筷子的死锁问题,(先入先得,公平锁),释放筷子让别人拿到就能解决死锁。先入先得,用得少,影响性能,其他方法一般都是非公平的。原创 2024-03-14 16:47:03 · 254 阅读 · 0 评论 -
JUC 进阶成神系列05—线程安全之 Park&Unpark
Park&Unpack 是以线程为单位来阻塞和唤醒线程,而 notify 只能随机唤醒一个等待线程,notifyAll 是唤醒所有等待线程,就不那么精确。检查_conter,本情况为 1,这时线程无需阻塞,继续运行,设置_counter 为 0。唤醒_cond 条件变量中的 Thread_0,线程恢复运行,运行之后又把干粮吃掉,设置_counter 为 0。线程:旅人,Parker:背包,条件变量:背包中的帐篷,_counter:背包中的备用干粮(0为耗尽,1为充足)备用干粮充足,不需停留,继续前进。原创 2024-03-14 16:21:58 · 260 阅读 · 0 评论 -
JUC进阶成神系列04—线程安全之 wait notify
obj.wait()让进入 object 监视器的线程到 waitSet 等待。**wait()**方法会释放对象的锁,进入 WaitSet 等待区,从而让其他线程就机会获取对象的锁。原创 2024-03-14 16:10:07 · 390 阅读 · 0 评论 -
JUC 进阶成神系列03—线程安全之 synchronized
这里的线程安全指的是,多个线程调用它们同一个实例的某个方法时,是线程安全的。加锁与不加锁得分相近的原因:JIT即时编译器会对字节码进行进一步优化,对java代码是用解释的方法执行,但是对热点代码反复调用的方法会进行优化,手段是分析看局部变量是不是能优化,根本不可能逃离方法作用范围,不可能被共享,synchronized 解决方案即俗称的对象锁,采用互斥的方式让同一时刻最多只有一个线程能持有对象锁,其他线程再想获取这个对象锁就会阻塞,保证拥有锁的线程可以安全执行临界区代码,不用担心上下文切换。原创 2024-03-14 15:55:17 · 255 阅读 · 0 评论 -
JUC 进阶成神系列02—Java 与线程
狭义上的用户线程指的是完全建立在用户空间的线程库上,系统内核不能感知到用户线程的存在及如何实现的。HotSpot:它的每一个Java线程都是直接映射到一个操作系统原生线程来实现的,而且中间没有额外的间接结构,所以HotSpot自己是不会去干涉线程调度的(可以设置线程优先级给操作系统提供调度建议),全权交给底下的操作系统去处理,所以何时冻结或唤醒线程、该给线程分配多少处理器执行时间、该把线程安排给哪个处理器核心去执行等,都是由操作系统完成的,也都是由操作系统全权决定的。原创 2024-03-14 15:07:12 · 423 阅读 · 0 评论 -
JUC 进阶成神系列01—进程与线程
并发:单核CPU下,线程CPU串行执行,任务调度室将CPU时间片-最小15毫秒,切换非常快,肉眼察觉不到,“微观串行,宏观并行”,线程轮流使用CPU。线程通信简单,更轻量级,线程上下文切换比进程切换比底本低。程序由指令和数据组成,指令需要运行就要加载到CPU,数据需要读写就要加载到内存,进程就是加载指令、管理内存、管理IO的。进程有共享资源,供内部线程共享。线程共享进程内的内容,比如多个线程可以访问同一个共享变量。并行:多核CPU下,每个核都可以调度运行线程。线程存在于进程中,是进程的子集。原创 2024-03-14 14:29:22 · 157 阅读 · 0 评论