标签:逻辑 dex ati rgs rri java基础 star nta ice
自增自减就是常用的 a = a++ 或者 a = ++a;前者是后缀式,先把a赋值给a,再加一;后者是后缀式,先加一,在赋值给a;而且a++,++a并不是原子操作,在当线程环境下并不会出错,当放在多线程下时,就会出现数据错误的问题。
public class Test01 {
private static int a = 0;
private static int b = 0;
private static AtomicInteger atomicInteger = new AtomicInteger(0);
public static void main(String[] args) throws InterruptedException {
for (int i = 0; i < 10; i++){
Thread t = new Thread() {
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
a = a + 1;
b++;
atomicInteger.incrementAndGet();
}
}
};
t.start();
}
// 给计算机运算的时间
Thread.sleep(2000);
System.out.println("a = a + 1: " + a);
System.out.println("b++ :" + b);
System.out.println("原子操作: " + atomicInteger);
Thread.sleep(3000);
System.out.println("a = a + 1: " + a);
System.out.println("b++ :" + b);
System.out.println("原子操作: " + atomicInteger);
}
}
结果是
a = a + 1: 9526
b++ :9930
原子操作: 10000
a = a + 1: 9526
b++ :9930
原子操作: 10000
所以在多线程环境下进行自增自减时要注意加锁,因为缩略的自增自减其实是两个操作。另外我还发现a+++b,以及a---b都是采用了贪心策略,即从左至右运算的运算符会尽可能的匹配运算符,所以你会发现a--b会报错。
&&我们都用过,但是&有谁用过呢?他和&&有用什么不同呢,我们直接上代码一探究竟:
public class Test02 {
public static void main(String[] args) {
int a = 1;
int c = 0;
// 只要&&前面的等式有一个错了,就不会管后面的条件
if (a < c && a / c > 0){
System.out.println("&&");
}
// if(a > c && a / c > 0){
// System.out.println();
// }
System.out.println("--------");
// 即使前面的等式错误,也要判断完所有的条件
if (a < c & a / c > 0){
System.out.println("&");
}
}
}
结果:
--------
Exception in thread "main" java.lang.ArithmeticException: / by zero
at base.Test02.main(Test02.java:15)
显然,&和&&都具有逻辑与的功能,只有在所有条件都满足的情况下才进入if代码块,只不过&&具有短路性,对于&&运算符两端的等式,从左往右执行该等式,只要有一个 等式不满足就直接跳出if代码块,而&运算符,总是会判断完所有的条件等式。
标签:逻辑 dex ati rgs rri java基础 star nta ice
原文地址:https://www.cnblogs.com/curiousforcode/p/12003202.html