1.下面代码:
String p="abc";
String q="cde";
if (p==(p=q))
{
System.out.println(true);
}
System.out.println(p);
打印结果:
ced
如果改为:
String p="abc";
String q="cde";
if (p!=(p=q))
{
System.out.println(true);
}
System.out.println(p);
打印结果:
true
cde
而如果这样写:
String p="abc";
String q="cde";
if ((p=q)==p)
{
System.out.println(true);
}
System.out.println(p);
输入结果则为:
true
cde
当执行if (p==(p=q))这句判断时,程序先获取到p的值,然后拿它和(p=q)的结果进行比较,在比较前,p已经被改变了,但是程序不会回头重新获取一次p的值,而是拿之前获取到的值和后面得到的值进行比较,所以结果为false。
2.ConcurrentLinkedQueue的size方法不是线程安全的,在执行该方法期间如果另一个线程进行了remove,结果会不准。