synchronized 是java中用來同步的方法,詳細的就不介紹了。 synchronized的用法為: synchronized(鎖){ 代碼塊 }
這個鎖是什么呢,我看了很多說法但沒有一個能講清楚的。 通過一段時間的使用后逐漸發現了一些synchronized使用的規律 使用synchronized是為了防止多個線程同時處理同一個方法,例如在同一時間使用push方法。 問題在於鎖使用的范圍,其實這個我也不是很清楚,我只說一些我了解的。 這個“鎖”應該就是一個字符串,對於使用相同“鎖”的synchronized,synchronized中的代碼塊不能同時運行,最簡單的例子就是: Thread[] t = new Thread[10]; for (int i = 0; i < t.length; i++) { int finalI = i; t[i] = new Thread(new Runnable() { @Override public void run() { synchronized ("AAAAA") { System.out.println(Thread.currentThread().getName()); try { Thread.sleep(1000); }catch (InterruptedException e){ e.printStackTrace(); } } } }); t[i].start(); } for (int i = 0; i <t.length ; i++) { t[i].join(); }
這和普通的for循環就沒有區別了,因為每個線程用的是同一個“鎖”--"AAAAA",如果把鎖改成Thread.currentThread().getName(),就可以多線程了,因為每一個線程的名字不一樣,所以“鎖”就不一樣。 所以如果要同步就要保證“鎖”是一樣的,或者說地址一樣。