大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。
Java内存模型是保障多线程安全的根基,这里不过认识型的理解总结并未深入研究。
一、什么是内存模型,为什么须要它
Java内存模型(Java Memory Model)并发相关的安全公布,同步策略的规范、一致性等都来自于JMM。
2 重排序
3 Java内存模型简单介绍
程序顺序规则。假设程序中操作A在操作B之前,那么在线程中A操作将在B操作之前运行。
监视器锁规则。在监视器锁上的解锁操作必须在同一个监视器上的加锁操作之前运行。
Volative变量规则。对Volative变量的写入操作必须在对该变量的读操作之前运行。
线程启动规则。在线程上对Thread.Start的调用必须在线程中运行不论什么操作之前运行。
线程结束规则。在线程中的不论什么操作都必须在其它线程检測到该线程已结束之前运行,或者从Thread.join中成功返回,或者调用Threas.isAlive时返回false。
中断规则。当一个线程在还有一个线程上调用interrupt时,必须在被中断线程检測到interrupt调用之前运行(通过抛出InterruptedException,或者调用isInterrupted和interrupted)。
终结器规则。对象的构造函数必须在启动该对象的终结器之前运行完毕。
传递性。假设操作A在操作B之前运行,而且操作B在操作C之前运行,则操作A必须在操作C之前运行。
4 借助同步
将一个元素放入一个线程安全容器的操作将在还有一个线程从该容器中获得这个元素的操作之前运行。
在CountDownLatch上的倒数操作将在线程从闭锁上的await方法中返回之前运行。
释放Semaphore许可的操作将在从该Semaphore上获得一个许可之前运行。
Future表示的任务的全部操作将在Future.get中返回之前运行。
向Executor提交一个Runnable或Callable的操作将在任务開始运行之前运行。
一个线程到达CyclicBarrier或Exchanger的操作将在其它到达该栅栏或交换点的线程被释放之前运行。假设CyclicBarrier使用一个栅栏操作,那么到达栅栏的操作将在栅栏操作之前运行,而栅栏操作又会在线程从栅栏中释放之前运行。
二、公布
1 不安全的公布
2 安全的公布
3 安全初始化模式
4 双重检查加锁
三、初始化过程中的安全性
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/118104.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...