当前位置: 首页 > news >正文

个人简约网站模板免费下载建筑工程公司注册需要什么条件

个人简约网站模板免费下载,建筑工程公司注册需要什么条件,网站欢迎页面 特效,购物网站论文Java 语言中的volatile变量可以被看作是一种“程度较轻的synchronized”#xff0c;与synchronized相比#xff0c;volatile变量所需的编码较少#xff0c;并且运行时开销也较少#xff0c;但是它所能实现的功能也仅是synchronized的一部分。本文介绍了几种有效使用volatil… Java 语言中的volatile变量可以被看作是一种“程度较轻的synchronized”与synchronized相比volatile变量所需的编码较少并且运行时开销也较少但是它所能实现的功能也仅是synchronized的一部分。本文介绍了几种有效使用volatile变量的模式并强调了几种不适合使用 volatile 变量的情形。 锁提供了两种主要特性互斥mutual exclusion和可见性visibility。互斥即一次只允许一个线程持有某个特定的锁因此可使用该特性实现对共享数据的协调访问协议这样一次就只有一个线程能够使用该共享数据。可见性要更加复杂一些它必须确保释放锁之前对共享数据做出的更改对于随后获得该锁的另一个线程是可见的如果没有同步机制提供的这种可见性保证线程看到的共享变量可能是修改前的值或不一致的值这将引发许多严重问题。 volatile变量 volatile变量具有synchronized的可见性特性但是不具备原子特性。这就是说线程能够自动发现volatile变量的最新值。volatile 变量可用于提供线程安全但是只能应用于非常有限的一组用例多个变量之间或者某个变量的当前值与修改后值之间没有约束。因此单独使用volatile还不足以实现计数器、互斥锁或任何具有与多个变量相关的不变式Invariants的类例如start end。 出于简易性或可伸缩性的考虑您可能倾向于使用volatile 变量而不是锁。当使用volatile变量而非锁时某些习惯用法idiom更加易于编码和阅读。此外volatile 变量不会像锁那样造成线程阻塞因此也很少造成可伸缩性问题。在某些情况下如果读操作远远大于写操作volatile 变量还可以提供优于锁的性能优势。(volatile类型变量并不会被重排序也不会被缓存每次都会从内存中获取最新值) 正确使用volatile变量的条件 您只能在有限的一些情形下使用volatile变量替代锁。要使volatile变量提供理想的线程安全必须同时满足下面两个条件 对变量的写操作不依赖于当前值该变量没有包含在具有其他变量的不变式中 实际上这些条件表明可以被写入volatile变量的这些有效值独立于任何程序的状态包括变量的当前状态。 第一个条件的限制使volatile 变量不能用作线程安全计数器。虽然增量操作x看上去类似一个单独操作实际上它是一个由读取修改写入操作序列组成的组合操作必须以原子方式执行而volatile不能提供必须的原子特性。实现正确的操作需要使x的值在操作期间保持不变而volatile变量无法实现这点。然而如果将值调整为只从单个线程写入那么可以忽略第一个条件 大多数编程情形都会与这两个条件的其中之一冲突使得volatile变量不能像synchronized那样普遍适用于实现线程安全。清单 1 显示了一个非线程安全的数值范围类。它包含了一个不变式下界总是小于或等于上界。清单 1.非线程安全的数值范围类 NotThreadSafe public class NumberRange {private int lower, upper;public int getLower() { return lower; }public int getUpper() { return upper; }public void setLower(int value) { if (value upper) throw new IllegalArgumentException(...);lower value;}public void setUpper(int value) { if (value lower) throw new IllegalArgumentException(...);upper value;} } 这种方式限制了范围的状态变量因此将lower和upper字段定义为volatile类型不能够充分实现类的线程安全从而仍然需要使用同步。否则如果凑巧两个线程在同一时间使用不一致的值执行setLower和setUpper的话则会使范围处于不一致的状态。例如如果初始状态是0,5)同一时间内线程A调用setLower(4)并且线程B调用setUpper(3)显然这两个操作交叉存入的值是不符合条件的那么两个线程都会通过用于保护不变式的检查使得最后的范围值是(4,3)——一个无效值。至于针对范围的其他操作我们需要使setLower()和setUpper()操作原子化——而将字段定义为volatile类型是无法实现这一目的的。 性能考虑 使用volatile变量的主要原因是其简易性在某些情形下使用volatile变量要比使用相应的锁简单得多。使用volatile变量次要原因是其性能某些情况下volatile变量同步机制的性能要优于锁。 很难做出准确、全面的评价例如“X总是比Y快”尤其是对JVM 内在的操作而言。例如某些情况下VM 也许能够完全删除锁机制这使得我们难以抽象地比较volatile和synchronized的开销。就是说在目前大多数的处理器架构上volatile读操作开销非常低——几乎和非volatile读操作一样。而volatile写操作的开销要比非 volatile写操作多很多因为要保证可见性需要实现内存界定Memory Fence即便如此volatile的总开销仍然要比锁获取低。 volatile操作不会像锁一样造成阻塞因此在能够安全使用volatile的情况下volatile可以提供一些优于锁的可伸缩特性。如果读操作的次数要远远超过写操作与锁相比volatile 变量通常能够减少同步的性能开销。 正确使用volatile的模式 很多并发性专家事实上往往引导用户远离volatile变量因为使用它们要比使用锁更加容易出错。然而如果谨慎地遵循一些良好定义的模式就能够在很多场合内安全地使用 volatile变量。要始终牢记使用volatile的限制——只有在状态真正独立于程序内其他内容时才能使用volatile——这条规则能够避免将这些模式扩展到不安全的用例。 模式 #1状态标志 也许实现volatile变量的规范使用仅仅是使用一个布尔状态标志用于指示发生了一个重要的一次性事件例如完成初始化或请求停机。 很多应用程序包含了一种控制结构形式为“在还没有准备好停止程序时再执行一些工作”如清单 2 所示 清单 2.将volatile变量作为状态标志位使用 volatile boolean shutdownRequested;...public void shutdown() { shutdownRequested true; }public void doWork() { while (!shutdownRequested) { // do stuff} }很可能会从循环外部调用shutdown()方法——即在另一个线程中——因此需要执行某种同步来确保正确实现shutdownRequested变量的可见性。可能会从 JMX 侦听程序、GUI 事件线程中的操作侦听程序、通过 RMI 、通过一个 Web 服务等调用。然而使用synchronized块编写循环要比使用清单 2 所示的volatile状态标志编写麻烦很多。由于volatile简化了编码并且状态标志并不依赖于程序内任何其他状态因此此处非常适合使用volatile。 这种类型的状态标记的一个公共特性是通常只有一种状态转换shutdownRequested标志从false转换为true然后程序停止。这种模式可以扩展到来回转换的状态标志但是只有在转换周期不被察觉的情况下才能扩展从false到true再转换到false。此外还需要某些原子状态转换机制例如原子变量。 模式 #2一次性安全发布 缺乏同步会导致无法实现可见性这使得确定何时写入对象引用而不是原语值变得更加困难。在缺乏同步的情况下可能会遇到某个对象引用的更新值由另一个线程写入和该对象状态的旧值同时存在。这就是造成著名的双重检查锁定double-checked-locking问题的根源其中对象引用在没有同步的情况下进行读操作产生的问题是您可能会看到一个更新的引用但是仍然会通过该引用看到不完全构造的对象。 实现安全发布对象的一种技术就是将对象引用定义为volatile类型。清单 3 展示了一个示例其中后台线程在启动阶段从数据库加载一些数据。其他代码在能够利用这些数据时在使用之前将检查这些数据是否曾经发布过。清单 3.将volatile变量用作一次性安全发布 public class BackgroundFloobleLoader {public volatile Flooble theFlooble;public void initInBackground() {// do lots of stufftheFlooble new Flooble(); // this is the only write to theFlooble} }public class SomeOtherClass {public void doWork() {while (true) { // do some stuff...// use the Flooble, but only if it is readyif (floobleLoader.theFlooble ! null) doSomething(floobleLoader.theFlooble);}} } 如果theFlooble引用不是volatile类型doWork()中的代码在解除对theFlooble的引用时将会得到一个不完全构造的Flooble。 该模式的一个必要条件是被发布的对象必须是线程安全的或者是有效的不可变对象有效不可变意味着对象的状态在发布之后永远不会被修改。volatile类型的引用可以确保对象的发布形式的可见性但是如果对象的状态在发布后将发生更改那么就需要额外的同步。 模式 #3独立观察 安全使用volatile的另一种简单模式是定期“发布”观察结果供程序内部使用。例如假设有一种环境传感器能够感觉环境温度。一个后台线程可能会每隔几秒读取一次该传感器并更新包含当前文档的volatile变量。然后其他线程可以读取这个变量从而随时能够看到最新的温度值。 使用该模式的另一种应用程序就是收集程序的统计信息。清单 4 展示了身份验证机制如何记忆最近一次登录的用户的名字。将反复使用lastUser引用来发布值以供程序的其他部分使用。清单 4.将volatile变量用于多个独立观察结果的发布 public class UserManager {public volatile String lastUser;public boolean authenticate(String user, String password) {boolean valid passwordIsValid(user, password);if (valid) {User u new User();activeUsers.add(u);lastUser user;}return valid;} }该模式是前面模式的扩展将某个值发布以在程序内的其他地方使用但是与一次性事件的发布不同这是一系列独立事件。这个模式要求被发布的值是有效不可变的 —— 即值的状态在发布后不会更改。使用该值的代码需要清楚该值可能随时发生变化。 模式 #4volatile bean模式 volatile bean模式适用于将JavaBeans作为“荣誉结构”使用的框架。在volatile bean模式中JavaBean被用作一组具有getter和/或setter方法的独立属性的容器。volatile bean模式的基本原理是很多框架为易变数据的持有者例如HttpSession提供了容器但是放入这些容器中的对象必须是线程安全的。 在volatile bean模式中JavaBean的所有数据成员都是volatile类型的并且getter和setter方法必须非常普通——除了获取或设置相应的属性外不能包含任何逻辑。此外对于对象引用的数据成员引用的对象必须是有效不可变的。这将禁止具有数组值的属性因为当数组引用被声明为volatile时只有引用而不是数组本身具有volatile语义。对于任何volatile变量不变式或约束都不能包含JavaBean属性。清单 5 中的示例展示了遵守volatile bean模式的JavaBean清单 5.遵守volatile bean模式的Person对象 ThreadSafe public class Person {private volatile String firstName;private volatile String lastName;private volatile int age;public String getFirstName() { return firstName; }public String getLastName() { return lastName; }public int getAge() { return age; }public void setFirstName(String firstName) { this.firstName firstName;}public void setLastName(String lastName) { this.lastName lastName;}public void setAge(int age) { this.age age;} }volatile的高级模式 前面几节介绍的模式涵盖了大部分的基本用例在这些模式中使用volatile非常有用并且简单。这一节将介绍一种更加高级的模式在该模式中volatile将提供性能或可伸缩性优势。 volatile应用的的高级模式非常脆弱。因此必须对假设的条件仔细证明并且这些模式被严格地封装了起来因为即使非常小的更改也会损坏您的代码同样使用更高级的 volatile用例的原因是它能够提升性能确保在开始应用高级模式之前真正确定需要实现这种性能获益。需要对这些模式进行权衡放弃可读性或可维护性来换取可能的性能收益——如果您不需要提升性能或者不能够通过一个严格的测试程序证明您需要它那么这很可能是一次糟糕的交易因为您很可能会得不偿失换来的东西要比放弃的东西价值更低。 模式 #5开销较低的读 - 写锁策略 目前为止您应该了解了volatile的功能还不足以实现计数器。因为x实际上是三种操作读、添加、存储的简单组合如果多个线程凑巧试图同时对volatile计数器执行增量操作那么它的更新值有可能会丢失。 然而如果读操作远远超过写操作您可以结合使用内部锁和volatile变量来减少公共代码路径的开销。清单 6 中显示的线程安全的计数器使用synchronized确保增量操作是原子的并使用volatile保证当前结果的可见性。如果更新不频繁的话该方法可实现更好的性能因为读路径的开销仅仅涉及 volatile 读操作这通常要优于一个无竞争的锁获取的开销。清单 6.结合使用volatile和synchronized实现“开销较低的读 - 写锁” ThreadSafe public class CheesyCounter {// Employs the cheap read-write lock trick// All mutative operations MUST be done with the this lock heldGuardedBy(this) private volatile int value;public int getValue() { return value; }public synchronized int increment() {return value;} }之所以将这种技术称之为“开销较低的读写锁”是因为您使用了不同的同步机制进行读写操作。因为本例中的写操作违反了使用volatile的第一个条件因此不能使用volatile安全地实现计数器——您必须使用锁。然而您可以在读操作中使用volatile确保当前值的可见性因此可以使用锁进行所有变化的操作使用volatile进行只读操作。其中锁一次只允许一个线程访问值volatile允许多个线程执行读操作因此当使用volatile保证读代码路径时要比使用锁执行全部代码路径获得更高的共享度——就像读写操作一样。然而要随时牢记这种模式的弱点如果超越了该模式的最基本应用结合这两个竞争的同步机制将变得非常困难。 结束语 与锁相比volatile变量是一种非常简单但同时又非常脆弱的同步机制它在某些情况下将提供优于锁的性能和伸缩性。如果严格遵循volatile的使用条件——即变量真正独立于其他变量和自己以前的值——在某些情况下可以使用volatile代替synchronized来简化代码。然而使用volatile的代码往往比使用锁的代码更加容易出错。本文介绍的模式涵盖了可以使用volatile代替synchronized的最常见的一些用例。遵循这些模式注意使用时不要超过各自的限制可以帮助您安全地实现大多数用例使用volatile变量获得更佳性能。   转自http://www.ibm.com/developerworks/cn/java/j-jtp06197.html   转载于:https://www.cnblogs.com/sean-zou/archive/2013/04/16/3710071.html
http://www.zqtcl.cn/news/333059/

相关文章:

  • 毕业设计做网站应该学什么wordpress调用子分类
  • 怎么建网站做淘宝客用国外网站 图片做自媒体
  • 汕头建站模板搭建怎么制作有效网站
  • 学生个人网站作品怎么wordpress用的什么主题
  • 设计logo网站侵权吗知乎一键做单页网站
  • 网站服务器有什么用做视频网站视频存放问题
  • 影评网站建设可以免费发布招聘网站
  • 富阳做兼职的网站正邦设计上海分公司
  • 网站漏洞解决办法投资
  • wordpress网站如何网页设计实训总结3000字大学篇
  • 用ps怎么做网站导航条wordpress 开启缩略图
  • 网上销售型的企业网站为什么要域名备案
  • 唐山网站建设方案优化国内酷炫网站
  • 国外网站备案吗网站做一样没有侵权吧
  • 谷歌怎么建网站ps中怎样做网站轮播图片
  • 汕头有没有做网站廊坊宣传片制作公司
  • 百度快速收录网站有些人做网站不用钱的 对吗
  • 如何规划一个网站网站建设预付费入什么科目
  • 北京做网站的好公司有哪些网站建设杭州缘择低价
  • 建设网站团队张掖响应式建站平台
  • 中国建设之乡是哪里网站优化连云港哪家强?
  • 网站建设报价是多少30号长沙封城最新消息
  • 常州专业网站建设费用电商推广技巧
  • 辽源市网站建设南通营销网站开发
  • 新站优化案例去韩国用什么地图导航
  • 宁波网站制作与推广WordPress怎么文章分类
  • mvc 做网站国内的搜索引擎有哪些
  • 设计视频网站腾讯云服务器网站域名备案
  • 网站建设费算费用还是固定资产镇赉县做网站的
  • 山西 旅游 英文 网站建设wordpress 设置登陆界面