一个网站多个子域名优化,怎样做网址有自己的模板,互联网广告优化,企业网页设计尺寸程序是否线程安全#xff0c;取决于哪些要素呢#xff0c;主要是以下三个#xff1a;原子性#xff0c;可见性#xff0c;有序性。今天先一起来学习原子性。原子性#xff1a;我理解一个操作不可再分#xff0c;即为原子性。而在并发编程的环境中#xff0c;原子性的含…程序是否线程安全取决于哪些要素呢主要是以下三个原子性可见性有序性。今天先一起来学习原子性。原子性我理解一个操作不可再分即为原子性。而在并发编程的环境中原子性的含义就是只要该线程开始执行这一系列操作要么全部执行要么全部未执行不允许存在执行一半的情况。老生常谈的银行转账情况用于理解(仅限于理解真实的银行转账没这么简单)A账户向B账户转钱A账户转出1万元银行就必须保证B账户收到1万元即使有问题也必须保证是A账户转出失败钱还在A账户。不然A账户转了B账户却没收到银行的操作就不是原子性的客户的利益受到损失。谈及原子性问题需要先了解Java内存模型的基本情况为了执行效率java的内存被划分为工作内存与主内存(可类比为计算机的高速缓存与内存)如下图所示线程与工作内存和主内存工作内存中放着线程使用的主内存的拷贝。线程对变量的操作必须通过工作内存进行而不能直接访问主内存工作内存直接相互独立。内存模型中还定义了八种原子的操作指令供程序使用如下所示-----内容参考《深入理解java虚拟机》----beginlock(锁定)作用于主内存它把一个变量标记为一条线程独占状态read(读取)作用于主内存它把变量值从主内存传送到线程的工作内存中以便随后的load动作使用load(载入)作用于工作内存它把read操作的值放入工作内存中的变量副本中use(使用)作用于工作内存它把工作内存中的值传递给执行引擎每当虚拟机遇到一个需要使用这个变量的指令时候将会执行这个动作assign(赋值)作用于工作内存它把从执行引擎获取的值赋值给工作内存中的变量每当虚拟机遇到一个给变量赋值的指令时候执行该操作store(存储)作用于工作内存它把工作内存中的一个变量传送给主内存中以备随后的write操作使用write(写入)作用于主内存它把store传送值放到主内存中的变量中。unlock(解锁)作用于主内存它将一个处于锁定状态的变量释放出来释放后的变量才能够被其他线程锁定Java内存模型还规定了执行上述8种基本操作时必须满足如下规则:1、不允许read和load、store和write操作之一单独出现(即不允许一个变量从主存读取了但是工作内存不接受或者从工作内存发起会写了但是主存不接受的情况)以上两个操作必须按顺序执行但没有保证必须连续执行也就是说read与load之间、store与write之间是可插入其他指令的。2、不允许一个线程丢弃它的最近的assign操作即变量在工作内存中改变了之后必须把该变化同步回主内存。3、不允许一个线程无原因地(没有发生过任何assign操作)把数据从线程的工作内存同步回主内存中。4、一个新的变量只能从主内存中“诞生”不允许在工作内存中直接使用一个未被初始化(load或assign)的变量换句话说就是对一个变量实施use和store操作之前必须先执行过了assign和load操作。5、一个变量在同一个时刻只允许一条线程对其执行lock操作但lock操作可以被同一个条线程重复执行多次多次执行lock后只有执行相同次数的unlock操作变量才会被解锁。6、如果对一个变量执行lock操作将会清空工作内存中此变量的值在执行引擎使用这个变量前需要重新执行load或assign操作初始化变量的值。7、如果一个变量实现没有被lock操作锁定则不允许对它执行unlock操作也不允许去unlock一个被其他线程锁定的变量。8、对一个变量执行unlock操作之前必须先把此变量同步回主内存(执行store和write操作)。-----内容参考《深入理解java虚拟机》----end因此我们写了一个程序就很容易判断是否是具备原子性的如下所示:int x 10; //语句1long y100;//语句2int z x; //语句3x; //语句4z z 1; //语句5volatile int a0;ax;//语句6语句1只执行了assign语句将10赋给工作内存中的x原子的。语句2由于long类型为64位的java可能会出现写两次32位数据到工作内存的情况导致操作是非原子的(几乎所有虚拟机都对这种操作进行了封装使其变为和原子操作)语句3use获取x的值再assign赋值给z非原子的。语句4user获取x的值加1在assign赋值给x非原子的。语句5user获取z的值加1在assign赋值给z非原子的。语句6use获取x的值assign赋值给a并且马上store将a的新值存储到主内存中并将其他工作线程中的a值失效非原子的。 如果其他线程要获取a的值需要对应的工作内存重新从主内存中获取(volatile的可见性原理)。感兴趣的小伙伴欢迎关注我的公众号:暖爸的java家园