大家好,欢迎大家来到JAVA并发编程专题,欢迎大家多多交流!上文带大家了解了JVM的内存结构和JVM的内存模型(JMM),在本专题第一篇文章中我们也简单的写了一个线程不安全的有关计数的小Demo,没见的,大家可以翻阅往期的文章。今天就和大家讨论一下有关线程安全性的——原子性。
①什么是线程安全性
定义:当多个线程访问某一个类时,不管运行时环境采用何种调度方式或者这些进程将如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么就称为是线程安全的。
主要体现在三个特性,原子性,有序性,和可见性。
首先和大家探讨一下有关jdk类库中提供的原子实现类——Atomic包
②Atomic包介绍
一,首先,接着上文的一个简单的计数功能的实现。我们对于变量count的累加不采用基本的数据类型int,而是采用Atomic包中的AtomicInteger来实现完成。
利用Atomic包下的原子类做计数二,利用AtomicReference类去修改数据的值
AtomicReference修改值可能很多人没用过Atomic包的人不能理解这段代码所最后输出的值,那么就和大家说一下,第一次如果为0就修改为2,现在初始化状态reference就是0,所以修改,第二步如果为0修改为4,这行代码不执行,因为此时为4,依次类推,因此最终的输出结果为5。
三,AtomicIntegrefieldUpdate去做对象的比较,就是比较对象中的一个字段的值是否和你给你的那个值相同,相同就修改,不通就不执行,但要注意一点,你给的那个值不能用static关键词修饰,不许用volatile关键字修饰。以上都是Atomic包下对于原子操作处理所提供的类,还有AtomicBoolean等等,其实Atomic包下的类用法都十分的相似,在这里就不一一去举例子了。
②,对于java中的原子性,不单单要用到Atomic中的原子类,用java当中的synchronized,和Lock都是可以简单实现的。
简单互斥锁例子实现原子性的方法,在java中是十分多的,比如以上的synchronized,Lock,更或者说Atomic下的原子类等等,都是可以实现并发编程中的原子性问题的。至此以上为本次所说的原子性操作,后续会持续更新关于有序性,可见性等等。欢迎大家多多讨论技术问题,谢谢!
网友评论