boolean flag=if true false; flag=false; if(flag) 下面问题请帮我理顺下布尔类型在这里应用逻辑,简单通俗点

为什么flag一直为真啊【java吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:630,916贴子:
为什么flag一直为真啊收藏
String sql=&select*from students where suser=? and spwd=?&;try{PreparedStatement pstmt=conn.prepareStatement(sql);pstmt.setString(1, user.getUser());pstmt.setString(2, user.getPwd());System.out.println(user.getUser()+&
&+user.getPwd());flag=pstmt.execute();}catch(SQLException e){System.out.println(&访问sql出错&);}
谁知道为什么啊?
ResultSet rs=pstmt.executeQuery();你这是查询语句,要用executeQuery方法,然后用rs接受后使用rs.next逐条取参。我不太明白你为什么用布尔类型的去判断,如果只是想看看是否能查到内容,那就用rs!=null来确定就可以了。难道说你学的JDBC和我学的不一样?
package com.zdy.import java.sql.*;public class loginModel {public boolean login(User user){Connection conn=boolean flag=try{Class.forName(&com.mysql.jdbc.Driver&).newInstance();String url=&jdbc:mysql://localhost/date?useunicode=true&characterEncoding=gbk&;conn=DriverManager.getConnection(url,&root&,&root&);}catch(InstantiationException e){e.printStackTrace();}catch(IllegalAccessException e){e.printStackTrace();}catch(ClassNotFoundException e){e.printStackTrace();}catch(SQLException e){e.printStackTrace();}String sql=&select*from students where suser=? and spwd=?&;try{PreparedStatement pstmt=conn.prepareStatement(sql);pstmt.setString(1, user.getUser());pstmt.setString(2, user.getPwd());System.out.println(user.getUser()+&
&+user.getPwd());flag=pstmt.execute();}catch(SQLException e){System.out.println(&访问sql出错&);}}}
execute()返回值
executequery吧
execute一般用更新
自己断点试一下呗
登录百度帐号推荐应用问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
对于volatile的效果,大家可能都在书上或各种文章中见过,java语言规范里也对其有所描述。我对于它简单的理解就是多个线程(特别是多核情况下)共享访问修改一个实例或静态变量时,如果有一致性的需求可以通过将该变量声明为volatile,这样每次的读取都是强迫从主存读取,而非cpu的寄存器或cache.一次偶然的机会有个同事问起我怎么使用volatile,于是为了说明它的效果,我简单写了个程序:/**
VolatileTest.java
Copyright ekupeng,Inc. 2012
* @ClassName: VolatileTest
* @Description: Volatile测试
* @author Emerson
下午06:57:44
* @version V1.0
public class VolatileTest extends Thread {
// 非volatile标志
private static boolean flag1 =
// volatile标志
private static volatile boolean flag2 =
private int i = 0;
public void run() {
//Object o = new Object();
//synchronized (o) {
while (!flag1) {
//注意 : System.out.println(i);
if (flag2) {
System.out.println(&over:& + i);
public static void main(String[] args) {
VolatileTest t = new VolatileTest();
t.start();
Thread.currentThread().sleep(2000);
// 先更改flag1
Thread.currentThread().sleep(1000);
// 将flag2置为true,如果有机会进入if(flag2),则将退出循环
} catch (InterruptedException e) {
e.printStackTrace();
}因为预览时发现大段的注释会自动换行,影响阅读代码,所以我将代码中的注释提取出来:
外围标志flag1为非volatile,该线程(t)跑起来后由另一线程(main)将flag1改为true后,如果出现情况1.flag1如果不从主存重新读取,那他将继续以false运行,所以会继续循环并进入内部的flag2的if判断;如果出现情况2.flag1从主存重新读取,那他将以true运行,所以会跳出循环,也就没有机会进入flag2的if判断了;
如果出现情况1,将进入该判断,内部标志flag2为volatile,当线程(main)将flag2改为true后,因为flag2会从主存重新读取,将以true运行,所以将跳出循环,并打印&over&语句
为了确保flag1的变更有机会被t察觉,并保证flag2能在flag1变为true后进行一次以上while(!flag1)条件判断后再判断if(flag2),sleep1秒(1秒可以跑很多循环了)以上是我为了说明volatile的功能写的一段程序,目的是想说一个线程1在循环中通过非volatile的布尔变量来进行条件判断,即使在另一个线程2中修改了该布尔变量,由于该线程1的代码执行得到了某种性能优化,不会从主存重新读取布尔值,导致进入死循环,直到内部的volatile布尔值被改变才跳出。我的问题是:原本我以为会像预想那样的输出“over”语句,这样也说明了volatile的用处。但是我尝试了Sun JDK1.6,1.5,1.4,1.3,1.2(因为volatile是针对jit带来的优化,所以1.2之前的版本就没有尝试)之后发现只有1.2下才会看到该程序对于volatile的演示效果,输出了“over”语句。其他的都只是在外围的while(!flag1)中实时察觉flag1的变化并跳出了循环。原本以为是hotspot的问题,但是我尝试了hotspot的server或client,以及1.3的classic,都是没有效果的,只有1.2才能看到volatile的演示效果。哪位大神给细说下这个情况?ps:Object那把锁没有实质的意义,只是进出synchronized块时会重新从主存同步数据,我当时随手写了测了下,所以大家可以不考虑,我暂且将它注掉吧....为了说明这一点,我加了行代码:
//注意 : System.out.println(i);
这行代码要是去掉注释,volatile在JDK1.2下也将失去作用,因为System.out.println中含有同步块,一执行该方法,变量将从主存中重新读取。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
看到你的程序,我估计结果是什么都不输出,拿下代码,放入eclipse,{@fix:由于个人jdk配置,仅在jre1.6下运行},什么输出都没有。下面来说说原因:
1、对于非volatile修饰的变量,尽管jvm的优化,会导致变量的可见性问题,但这种可见性的问题也只是在短时间内高并发的情况下发生,CPU执行时会很快刷新Cache,一般的情况下很难出现,而且出现这种问题是不可预测的,与jvm, 机器配置环境等都有关。所以在未修改flag1之前,i会一直自增。一旦flag1修改后,sleep了1s,在flag2为修改之前,while循环就退出了,所以基本不会看到输出。
2、说说volatile的语义。volatile能保证可见性。其保证每次对volatile变量的读取会重新从主存中获取,以使得最新修改的值对其可见。(其大概的实现方式:每次写volatile变量时,会锁定系统总线,这样会导致其他CPU的Cache失效,这样下次读取时,CPU检测到Cache失效,会重新从主存中加载)。在jdk1.5之前,volatile只能保证可见性,但会re-order的问题,这也是著名的double-check-lock的问题(对此,可google出一大堆的文章)。在jdk1.5中,对volatile语义进行了增强,其保证jvm内存模型不会对volatile修饰的变量进行重排序(写volatile变量操作不会与其之前的读写操作重排,读volatile操作不会与其后的读写操作重排)[1], 之后double-check-lock才算实际的可用。
3、volatile提供的可见性和禁止指令重排的语义可以满足一定程度的同步性需求。对于volatile变量的使用,文献[2]中给出最佳实践:写入变量时并不依赖变量的当前值,或者可以确保只有单一线程修改该变量值;变量不需要和其他成员变量一起参与类的状态不变性约束;访问变量时,没有其他额外的原因需要加锁。参考文献:
[1] ~pugh/java/memoryModel/DoubleCheckedLocking.html
[2] Java Concurrency in Practice. Author: Doug Lea. etc
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
// 非volatile标志 这个很难说得准就一定拷贝之类的,你还是倒过来试试 用// volatile标志 。
或许还跟同步哪个对象有关?
或许又跟静态变量有关?
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
我理解的volatile并非用在你的例子所描述的场景里的。不考虑volatile存在的情况,如果修改flag1的值不能让程序跳出循环,恐怕也不是我们想要的结果。
volatile主要是为了用在数据读写的一致性问题上的。举个例子,在32位机上,一个long是64位,那么给一个long赋值就至少需要两条指令,先写高位再写低位。如果有两个线程,一个写,一个读,就有可能出现读的线程读到了只写了一半的值,出现不一致的情况。volatile保证了能读到完整的值。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
想验证volatile比较难, 下面的实验在我的jre7上可以重现:
//1. 使用volatile, 程序可以退出.
public class VolatileTest extends Thread {
private static volatile boolean flag =
public void run() {while (!flag);}
public static void main(String[] args) throws Exception {
new VolatileTest().start();
Thread.sleep(2000);
//2. 去掉volatile, 程序无法退出.
public class VolatileTest extends Thread {
private static boolean flag =
public void run() {while (!flag);}
public static void main(String[] args) throws Exception {
new VolatileTest().start();
Thread.sleep(2000);
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
volatile的作用是使CPU在读取变量值时,一定得去主存读取,不能直接从缓存读取
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
循环肯定会终止啊,t.flag1 =
Thread.currentThread().sleep(1000);
// 将flag2置为true,如果有机会进入if(flag2),则将退出循环
t.flag2 =main线程,对volatile变量flag2的修改,会导致,共享变量flag1和flag2刷新到主内存。
当线程 while (!flag1) {
//注意 : System.out.println(i);
if (flag2) {
System.out.println("over:" + i);
}对volatiel 变量flag2读的时候,线程会从主存读取数据,此时flag1 = true.
所以程序执行的效果,是循环一会后,退出外层循环。
同步到新浪微博
分享到微博?
Hi,欢迎来到 SegmentFault 技术社区!⊙▽⊙ 在这里,你可以提出编程相关的疑惑,关注感兴趣的问题,对认可的回答投赞同票;大家会帮你解决编程的问题,和你探讨技术更新,为你的回答投上赞同票。
明天提醒我
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
扫扫下载 App了解PHP里的boolean布尔值 -- 简明现代魔法新手入门:C++中布尔类型
  布尔类型对象可以被赋予文字值true或者false,所对应的关系就是真与假的概念。   我们通常使用的方法是利用他来判断条件的真与假,例如下面的代码: #include&&iostream&& using&namespace&& & void&main(void)& {& &&&&bool&found&=&true;& &&&&if&(found)& &&&&{& &&&&&&&&cout&&&&"found条件为真!"&&&&& &&&&}& & }  但是一些概念不清的人却不知道布尔类型的对象也可以被看做是一种整数类型的对象,但是他不能被声明成signed,unsigned,short long,如果你生成(short bool found=),那么将会导致编译错误。   其为整数类型的概念是这样的:  当表达式需要一个算术值的时候,布尔类型对象将被隐式的转换成int类型也就是整形对象, false就是0,true就是1,请看下面的代码! #include&&iostream&& #include&&string&& using&namespace&& & void&main(void)& {& bool&found&=&true;& int&a&=&1;& cout&&&&a&+&found&&&&& cin.get();& }   a+found 这样的表达式样是成立的,输出后的值为2进行了加法运算!   那么说到这里很多人会问指针也可以吗?回答是肯定的这样一个概念对于指针同样也是有效的,下面我们来看一个将整形指针对象当作布尔对象进行使用的例子:#include&&iostream&& using&namespace&& & void&main(void)& {& &&&&int&a&=&1;& &&&&int&*& &&&&pi=&a;& & &&&&if&(*pi)& &&&&{& &&&&&&&&cout&&&&"*pi为真"&&&&& &&&&}& &&&&cin.get();& }  上面代码中的*pi进行了隐式样的布尔类型转换表示为了真也就是true。
相关软件:
大小:1.93 MB
授权:免费
大小:62.51 MB
授权:免费扫二维码下载作业帮
拍照搜题,秒出答案,一键查看所有搜题记录
下载作业帮安装包
扫二维码下载作业帮
拍照搜题,秒出答案,一键查看所有搜题记录
flag=true在VB中是什么意思?
扫二维码下载作业帮
拍照搜题,秒出答案,一键查看所有搜题记录
flag应该是布尔型变量boolean有 true和false两个值(真假)true即为1..false为 0
为您推荐:
其他类似问题
就是可以进行后续程序的处理,如果为false则不能继续进行
将true(真)的布尔型常量赋给flag这个布尔型变量这就是这句的意思(拜托你下次不要把VB的问题归到“英语翻译”这个分类里来!)
扫描下载二维码}

我要回帖

更多关于 if true false 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信