仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 494|回复: 7
打印 上一主题 下一主题

[学习教程] 来看Java实际与理论:准确利用Volatile变量

[复制链接]
只想知道 该用户已被删除
跳转到指定楼层
#
发表于 2015-1-18 11:25:32 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
其实你不用Struts,spring这些工具,直接用jsp,servlet能够很方便地写出来,而且,可以根据个人的水平、爱好,有很多方案。而struts,spring这些工具的出来。
Java言语中的volatile变量能够被看做是一种“水平较轻的synchronized”;与synchronized块比拟,volatile变量所需的编码较少,而且运转时开支也较少,可是它所能完成的功效也仅是synchronized的一部分。本文先容了几种无效利用volatile变量的形式,并夸大了几种不合适利用volatile变量的情况。
锁供应了两种次要特征:互斥(mutualexclusion)和可见性(visibility)。互斥即一次只同意一个线程持有某个特定的锁,因而可以使用该特征完成对共享数据的和谐会见协定,如许,一次就只要一个线程可以利用该共享数据。可见性要加倍庞大一些,它必需确保开释锁之前对共享数据做出的变动关于随后取得该锁的另外一个线程是可见的——假如没有同步机制供应的这类可见性包管,线程看到的共享变量多是修正前的值或纷歧致的值,这将激发很多严峻成绩。
Volatile变量
Volatile变量具有synchronized的可见性特征,可是不具有原子特征。这就是说线程可以主动发明volatile变量的最新值。Volatile变量可用于供应线程平安,可是只能使用于十分无限的一组用例:多个变量之间大概某个变量确当前值与修正后值之间没有束缚。因而,独自利用volatile还不敷以完成计数器、互斥锁或任何具有与多个变量相干的稳定式(Invariants)的类(比方“start<=end”)。
出于浅易性或可伸缩性的思索,您大概偏向于利用volatile变量而不是锁。当利用volatile变量而非锁时,某些习气用法(idiom)加倍易于编码和浏览。别的,volatile变量不会像锁那样形成线程堵塞,因而也很少形成可伸缩性成绩。在某些情形下,假如读操纵远宏大于写操纵,volatile变量还能够供应优于锁的功能上风。
准确利用volatile变量的前提
您只能在无限的一些情况下利用volatile变量替换锁。要使volatile变量供应幻想的线程平安,必需同时满意上面两个前提:
对变量的写操纵不依附于以后值。
该变量没有包括在具有其他变量的稳定式中。
实践上,这些前提标明,能够被写进volatile变量的这些无效值自力于任何程序的形态,包含变量确当前形态。
第一个前提的限定使volatile变量不克不及用作线程平安计数器。固然增量操纵(x++)看上往相似一个独自操纵,实践上它是一个由读取-修正-写进操纵序列构成的组合操纵,必需以原子体例实行,而volatile不克不及供应必需的原子特征。完成准确的操纵必要使x的值在操纵时代坚持稳定,而volatile变量没法完成这点。(但是,假如将值调剂为只从单个线程写进,那末能够疏忽第一个前提。)
年夜多半编程情况城市与这两个前提的个中之一抵触,使得volatile变量不克不及像synchronized那样广泛合用于完成线程平安。清单1显现了一个非线程平安的数值局限类。它包括了一个稳定式——下界老是小于或即是上界。
清单1.非线程平安的数值局限类
@NotThreadSafe
publicclassNumberRange{
privateintlower,upper;
publicintgetLower(){returnlower;}
publicintgetUpper(){returnupper;}
publicvoidsetLower(intvalue){
if(value>upper)
thrownewIllegalArgumentException(...);
lower=value;
}
publicvoidsetUpper(intvalue){
if(value<lower)
thrownewIllegalArgumentException(...);
upper=value;
}
}
这类体例限定了局限的形态变量,因而将lower和upper字段界说为volatile范例不克不及够充实完成类的线程平安;从而仍旧必要利用同步。不然,假如恰巧两个线程在统一工夫利用纷歧致的值实行setLower和setUpper的话,则会使局限处于纷歧致的形态。比方,假如初始形态是(0,5),统一工夫内,线程A挪用setLower(4)而且线程B挪用setUpper(3),明显这两个操纵交织存进的值是不切合前提的,那末两个线程城市经由过程用于回护稳定式的反省,使得最初的局限值是(4,3)——一个有效值。至于针对局限的其他操纵,我们必要使setLower()和setUpper()操纵原子化——而将字段界说为volatile范例是没法完成这一目标的。
<p>
再说说缺点:首先java功能强大的背后是其复杂性,就拿web来说,当今流行的框架有很多,什么struts,spring,jQuery等等,而这无疑增加了java的复杂性。
蒙在股里 该用户已被删除
7#
发表于 2015-3-20 22:36:47 | 只看该作者
有时间再研究一下MVC结构(把Model-View-Control分离开的设计思想)
活着的死人 该用户已被删除
6#
发表于 2015-3-7 01:26:06 | 只看该作者
你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢?
深爱那片海 该用户已被删除
5#
发表于 2015-3-4 11:29:31 | 只看该作者
是一种突破用户端机器环境和CPU
再现理想 该用户已被删除
地板
发表于 2015-2-13 05:36:21 | 只看该作者
所以现在应用最广泛又最好学的就是J2EE了。 J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。
小女巫 该用户已被删除
板凳
发表于 2015-2-6 09:30:28 | 只看该作者
不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。
变相怪杰 该用户已被删除
沙发
发表于 2015-1-30 09:21:26 | 只看该作者
是一种突破用户端机器环境和CPU
第二个灵魂 该用户已被删除
楼主
发表于 2015-1-21 06:08:11 来自手机 | 只看该作者
是一种使用者不需花费很多时间学习的语言
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-9-22 15:35

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表