java 实现按规则自增功能_java运算符详解 - osc_74vaali6的个人空间 - OSCHINA - 中文开源技术交流社区...
java基礎(2)--運算符詳解
自增自減規則
自增自減就是常用的 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代碼塊,而&運算符,總是會判斷完所有的條件等式。
總結
以上是生活随笔為你收集整理的java 实现按规则自增功能_java运算符详解 - osc_74vaali6的个人空间 - OSCHINA - 中文开源技术交流社区...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 公路商店app怎么看好东西
- 下一篇: java打印等边三角市,java 打印菱