破除Java神话之三

2016-02-19 16:01 6 1 收藏

每个人都希望每天都是开心的,不要因为一些琐事扰乱了心情还,闲暇的时间怎么打发,关注图老师可以让你学习更多的好东西,下面为大家推荐破除Java神话之三,赶紧看过来吧!

【 tulaoshi.com - 编程语言 】

Java中原子操作是线程安全的论调经常被提到。根据定义,原子操作是不会被打断的操作,因此被认为是线程安全的。实际上有一些原子操作不一定是线程安全的。
  
   !-- frame contents -- !-- /frame contents --   这个问题出现的原因是尽量减少在代码中同步要害字。同步会损害性能,虽然这个损失因JVM不同而不同。另外,在现代的JVM中,同步的性能正在逐步提高。尽管如此,使用同步仍然是有性能代价的,并且程序员永远会尽力提高他们的代码的效率,因此这个问题就延续了下来。
  
  在java中,32位或者更少位数的赋值是原子的。在一个32位的硬件平台上,除了double和long型的其它原始类型通常都是使用32位进行表示,而double和long通常使用64位表示。另外,对象引用使用本机指针实现,通常也是32位的。对这些32位的类型的操作是原子的。
  
  这些原始类型通常使用32位或者64位表示,这又引入了另一个小小的神话:原始类型的大小是由语言保证的。这是不对的。java语言保证的是原始类型的表数范围而非JVM中的存储大小。因此,int型总是有相同的表数范围。在一个JVM上可能使用32位实现,而在另一个JVM上可能是64位的。在此再次强调:在所有平台上被保证的是表数范围,32位以及更小的值的操作是原子的。
  
  那么,原子操作在什么情况下不是线程安全的?主要的一点是他们也许确实是线程安全的,但是这没有被保证!java线程答应线程在自己的内存区保存变量的副本。答应线程使用本地的私有拷贝进行工作而非每次都使用主存的值是为了提高性能。考虑下面的类:
  
  class RealTimeClock
  {
  private int clkID;
  public int clockID()
  {
  return clkID;
  }
  public void setClockID(int id)
  {
  clkID = id;
  }
  //...
  }
  现在考虑RealTimeClock的一个实例以及两个线程同时调用setClockID和clockID,并发生以下的事件序列:
  
  T1 调用setClockID(5)
  T1将5放入自己的私有工作内存
  T2调用setClockID(10)
  T2将10放入自己的私有工作内存
  T1调用clockID,它返回5
  5是从T1的私有工作内存返回的
  
  对clockI的调用应该返回10,因为这是被T2设置的,然而返回的是5,因为读写操作是对私有工作内存的而非主存。赋值操作当然是原子的,但是因为JVM答应这种行为,因此线程安全不是一定的,同时,JVM的这种行为也不是被保证的。
  
  两个线程拥有自己的私有拷贝而不和主存一致。假如这种行为出现,那么私有本机变量和主存一致必须在以下两个条件下:
  
  1、变量使用volatile声明
  2、被访问的变量处于同步方法或者同步块中
  
  假如变量被声明为volatile,在每次访问时都会和主存一致。这个一致性是由java语言保证的,并且是原子的,即使是64位的值。(注重很多JVM没有正确的实现volatile要害字。你可以在www.javasoft.com找到更多的信息。)另外,假如变量在同步方法或者同步块中被访问,当在方法或者块的入口处获得锁以及方法或者块退出时释放锁是变量被同步。
  
  使用任何一种方法都可以保证ClockID返回10,也就是正确的值。变量访问的频度不同则你的选择的性能不同。假如你更新很多变量,那么使用volatile可能比使用同步更慢。记住,假如变量被声明为volatile,那么在每次访问时都会和主存一致。与此对照,使用同步时,变量只在获得锁和释放锁的时候和主存一致。但是同步使得代码有较少的并发性。
  
  假如你更新很多变量并且不想有每次访问都和主存进行同步的损失或者你因为其它的原因想排除并发性时可以考虑使用同步。

来源:http://www.tulaoshi.com/n/20160219/1610889.html

延伸阅读
标签: PS PS教程
本文由中国专家hf-2048原创,转载须保留此信息 之前已经发过两篇,但之前的两篇主要讲的是偏色照片的调正及美化. 今天要讲的是对数码照片进行润色和对人物的细节进行调整. 调色练习教程之一: http://bbs.jcwcn.com/viewthread.php?tid=24483&extra=page%3D1 调色练习教程之二: http://bbs.jcwcn.com/viewthread.php?tid=24828&ext...
标签: Web开发
XML的未来 现在你已经知道XML。确实,结构有点复杂,而且DTD有各种可 以定义文档可以包含的内容的选项。但还不只这些。 考虑一个数据交换对其很重要的产业,如银行。银行使用所有 权系统来跟踪内部的交易,但是如果他们在Web上使用一种通用 的XML格式,那么他们必须描述交易信息给另一个机构或应用程 序(如Quic...
标签: SQLServer
  我们日常使用SQL语言的工作过程中,使用最多的还是从已经建立好的数据库中查询信息。下面,我们就来详细介绍一下如何使用SQL语言实现各种数据库查询操作。 SELECT…FROM 为方便讲解,我们在数据库中创建名为Store_Information的如下数据表。 Store_Information Store_Name Sales Date Los Angeles $1500 Jan-10-2000...
《三国志10》心得之三 私练精兵后篇 1,选定私兵的类型,一般推荐弓兵或骑兵,将在野武将的据点对应地迁到宛或晋阳(适用于剧本1)。 2,在酒馆征齐一万兵,训练到极限。 3,开始在野外游荡,看到有军团开战就上去凑热闹,帮助强势的一方,尽量完成对敌方各部队的最后一击,争取更多的功勋,拿到更多的酬金(功勋的4倍左右)。 4,如果碰到有军...
标签: ASP
       SQL语言快速入门之三(一)   吕晓波      SQL语言快速入门之三          我们日常使用SQL语言的工作过程中,使用最多的还是从已经建立好的数据库中查询信息。下面,我们就来详细介绍一下如何使用SQL语言实现各种数据库查询操作。 ...

经验教程

551

收藏

40
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部