在java中,什么是原子性
原子性,就是不会有中间状态存在,要么什么都没改变,要么全都改变。不会有一部分没改变,一部分改变了。 引用赋值,或者说所有赋值操作都不是原子性的。 对应的原子类是AtomicReferenc。
原子性(Atomicity)Java中,对基本数据类型的读取和赋值操作是原子性操作,所谓原子性操作就是指这些操作是不可中断的,要做一定做完,要么就没有执行。
原子性:指整个事务是不可以分割的工作单元。只有事务中所有的操作执行成功,才算整个事务成功,事务中任何一个SQL语句执行失败,那么已经执行成功的SQL语句也必须撤销,数据库状态应该回到执行事务前的状态。
不太清楚你说的boolean是原子性是什么意思,只知道他是java的基本类型。刚搜索了下,你说的原子性应该是线程安全吧。boolean需要转换成AtomicBoolean类型才是原子性的。我刚搜了下一个类似的文章你可以看下。
Java是怎么保证原子性,可见性
不是的,实际它是i=i+1,这个操作首先要读取i的值,然后为i值加1。是需要拆分的。非原子操作都会存在线程安全问题,需要我们使用同步技术(sychronized)来让它变成一个原子操作。有好几种方式实现一个原子操作。
原子性:原子,即一个不可再被分割的颗粒。原子性指的是一个或多个操作要么 全部执行成功要么全部执行失败。可见性:一个线程对共享变量的修改,另一个线程能够立刻看到。
从上面可以看出,Java内存模型只保证了基本读取和赋值是原子性操作, 如果要实现更大范围操作的原子性,可以通过synchronized和Lock来实现。
再次强调,关键字volition解决的是变量在多个线程之间的可见性;而synchronized关键字解决的是多个线程之间访问资源的同步性。线程安全包含原子性和可见性两个方面,java的同步机制都是围绕这两个方面来却保线程安全的。
读取都会从主存中读取,但是读取bchange的时候可能是true,但线程b改变后,导致第二个!bchange读取的值是改变过后的值 线程安全必须满足原子性,可见性,有序性,Voliate只能保证可见性和有序性。
Java中如何保证线程安全性
第一种,修改线程模型。即不在线程之间共享该状态变量。一般这个改动比较大,需要量力而行。第二种,将对象变为不可变对象。有时候实现不了。第三种,就比较通用了,在访问状态变量时使用同步。
写一致性 Java 提供了三种方式来保证读写一致性,分别是互斥锁、自旋锁、线程隔离。互斥锁 互斥锁只是一个锁概念,在其他场景也叫做独占锁、悲观锁等,其实就是一个意思。
有序性:程序执行的顺序按照代码的先后顺序执行。
Java中线程内部调用实例方法时,其线程安全性取决于该实例方法是否是线程安全的。