java中的原子操作和线程安全是具有一定的联系性的,这其中的内容也是比较复杂的。它们所涉及的范围也是非常的广阔的。不知道你掌握了吗?一起来看看吧。
首先说一下,什么叫原子的(原子操作)?
Java原子操作是指:不会被打断地的操作。(就是做到互斥和可见性)
那难道原子操作就可以真的达到线程安全同步效果了吗?实际上有一些原子操作不一定是线程安全的。那么,原子操作在什么情况下不是线程安全的呢?
也许是这个原因导致的:java线程允许线程在自己的内存区保存变量的副本。
允许线程使用本地的私有拷贝进行工作而非每次都使用主存的值是为了提高性能后,就是各自做自己的副本了,更新操作(写操作)因未写入主存中,导致其它线程不可见)。
那该如何解决呢?
因此需要通过java同步机制。
在java中,32位或者更少位数的赋值是原子的。在一个32位的硬件平台上,除了double和long型的其它原始类型通常都是使用32位进行表示,而double和long通常使用64位表示。另外,对象引用使用本机指针实现,通常也是32位的。对这些32位的类型的操作是原子的。
这些原始类型通常使用32位或者64位表示,这又引入了另一个小小的神话:原始类型的大小是由语言保证的。这是不对的。java语言保证的是原始类型的表数范围而非JVM中的存储大小。因此,int型总是有相同的表数范围。在一个JVM上可能使用32位实现,而在另一个JVM上可能是64位的。
再次强调:在所有平台上被保证的是表数范围,32位以及更小的值的操作是原子的。
然后举例为大家区分同步与异步。
举例说明:普通B/S模式(同步)AJAX技术(异步)
同步:提交请求->等待服务器处理->处理完返回这个期间客户端浏览器不能干任何事
异步:请求通过事件触发->服务器处理(这是浏览器仍然可以作其他事情)->处理完毕
可见,彼“同步”非此“同步”——我们说的java中的那个共享数据同步(synchronized)
一个同步的对象是指行为(动作),一个是同步的对象是指物质(共享数据)。
以上就是关于java中原子操作是什么的主要内容了。并且为大家举例来区分同、异步之间的不同。如果你对java知识感兴趣,想要了解更多java基础知识,敬请关注奇Q工具网。
推荐阅读: