| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1106 人关注过本帖
标题:谁能举一个不用volatile修饰会出错的代码
只看楼主 加入收藏
jingzitakk66
Rank: 1
等 级:新手上路
帖 子:198
专家分:0
注 册:2009-5-1
结帖率:98.68%
收藏
已结贴  问题点数:10 回复次数:9 
谁能举一个不用volatile修饰会出错的代码
我知道volatile的作用,但没法自己写一个来证明,谁能举一个不用volatile修饰会出错的代码?
搜索更多相关主题的帖子: 代码 volatile 
2010-09-20 14:34
syg5434
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:山沟沟
等 级:版主
威 望:10
帖 子:285
专家分:781
注 册:2010-2-28
收藏
得分:2 
你说的是验证?服务器端的验证?

不要迷恋哥,嫂子会揍你。阿-弥-陀-佛--!
2010-09-20 14:53
jingzitakk66
Rank: 1
等 级:新手上路
帖 子:198
专家分:0
注 册:2009-5-1
收藏
得分:0 
回复 2楼 syg5434
我就想写一个小程序验证一下,因为听多了volatile的用法,但没看到过实际列子。
2010-09-20 15:15
syg5434
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:山沟沟
等 级:版主
威 望:10
帖 子:285
专家分:781
注 册:2010-2-28
收藏
得分:0 
我用的就是表单验证,用户名不合法,已经被占用等的验证用的是这个。
例子如下:
jsp页面中:
程序代码:
<form name="ctl00" action="regist.action" id="f">
                <table class="tab_login">
                    <tr>
                        <td valign="top" class="w1">
                            请填写您的Email地址:
                        </td>
                        <td>
                            <input name="user.email" type="text" id="txtEmail"
                                class="text_input" onblur="checkEmail()" />
                            <div class="text_left" id="emailValidMsg">
                                <p>
                                    请填写有效的Email地址,在下一步中您将用此邮箱接收验证邮件。
                                </p>
                                <span id="email.info" style="color:red"> <s:fielderror>
                                        <s:param>emailErr</s:param>
                                    </s:fielderror> </span>
                            </div>
                        </td>
                    </tr>
<from>
通过form中的action指定到xml配置中,转到相应的Action java类
在java类可以用validate方法来验证,代码如下:
程序代码:
public void validate() {
        UserDAO userDAO = DAOFactory.getUserDAO();
        try {
            //user对象是从页面传过来的,在类中直接定义就能接收,要有get   set方法
            //通过传过来的user对象得到用户注册用邮箱,再去数据库中查找,看是否已经存在
            User u = userDAO.findByEmail(user.getEmail());
            if (u != null) {
                log.info("邮箱已存在!");//可有可无
                this.addFieldError("emailErr", "邮箱已存在!");
                return;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
在类中放入的emailErr最后会在jsp页面中的emailErr位置出现。

我这个是在struts2下做的,如果看的不是很明白,再讨论

不要迷恋哥,嫂子会揍你。阿-弥-陀-佛--!
2010-09-20 16:02
书呆
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:55
专家分:188
注 册:2010-3-26
收藏
得分:0 
回复 4楼 syg5434
LZ说的是关键字volatile的用法吧。

沉醉东风月下读。柴门闭,莫管客来无。
2010-09-20 16:10
syg5434
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:山沟沟
等 级:版主
威 望:10
帖 子:285
专家分:781
注 册:2010-2-28
收藏
得分:0 
我X,我这回贴真。。。

大家参考下吧,我就不删了。。

关于volatitle我不是特别的了解,弄清楚我再贴>。。。。

不要迷恋哥,嫂子会揍你。阿-弥-陀-佛--!
2010-09-20 16:25
书呆
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:55
专家分:188
注 册:2010-3-26
收藏
得分:0 
回复 3楼 jingzitakk66
volatile和同步块是java内在的两种同步机制。但是volatile的同步性不如同步块。
所以很多同步控制都是用同步块。而且volatile容易出错,有些专家甚至建议远离volatile :)
例如下面的代码:
程序代码:
volatile boolean foo;
...
public void method() { 
    while (!foo) { 
        // do stuff
    }
}


在多线程环境中,foo的值很可能在其他线程中被改变。而关键字volatile可以确保
每次都从内存中读取foo的值,而不是使用JVM的优化,从寄存器读。

沉醉东风月下读。柴门闭,莫管客来无。
2010-09-20 16:35
syg5434
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:山沟沟
等 级:版主
威 望:10
帖 子:285
专家分:781
注 册:2010-2-28
收藏
得分:0 
http://www.
找了点有关volatitle的,楼主自己去看看吧,
不好意思>。。。

不要迷恋哥,嫂子会揍你。阿-弥-陀-佛--!
2010-09-20 16:37
shellingford
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:19
帖 子:228
专家分:1348
注 册:2010-8-9
收藏
得分:8 
以下是引用jingzitakk66在2010-9-20 14:34:52的发言:

我知道volatile的作用,但没法自己写一个来证明,谁能举一个不用volatile修饰会出错的代码?



没有100%会出错的代码,可以说遇到出错的几率非常的低
非要检验,你可以写n个线程同时访问修改一个变量,看看是否有臧数据写入(几率依旧非常的低)。


Volatile一般情况下不能代替sychronized,因为volatile不能保证操作的原子性,即使只是i++,实际上也是由多个原子操作组成:read i; inc; write i,假如多个线程同时执行i++,volatile只能保证他们操作的i是同一块内存,但依然可能出现写入脏数据的情况。如果配合Java 5增加的atomic wrapper classes,对它们的increase之类的操作就不需要sychronized。
2010-09-20 17:14
jingzitakk66
Rank: 1
等 级:新手上路
帖 子:198
专家分:0
注 册:2009-5-1
收藏
得分:0 
回复 9楼 shellingford
那为什么double这种类型加volatile就变成原子操作呢?另外类的引用赋值是原子的吗?

[ 本帖最后由 jingzitakk66 于 2010-9-20 17:47 编辑 ]
2010-09-20 17:42
快速回复:谁能举一个不用volatile修饰会出错的代码
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.037293 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved