Java是一種面向?qū)ο蟮木幊陶Z言,擁有強大的多線程支持。多線程在提高程序效率和實現(xiàn)復(fù)雜功能方面都有著非常重要的作用。但是在多線程編程中,同步問題也是需要非常注意的。
什么是同步?簡單來說,同步就是為了保證多線程操作共享的資源(比如數(shù)據(jù)、文件等)的正確性和安全性。如果多個線程同時操作共享資源,很容易發(fā)生數(shù)據(jù)混亂或者不一致的情況。
Java提供了synchronized(同步)關(guān)鍵字來解決線程同步問題。使用synchronized可以將多個線程對共享資源的訪問變?yōu)榛コ獾模赐粫r刻只有一個線程可以訪問該資源。
public class SyncThread implements Runnable { private int count; public SyncThread() { count = 0; } public synchronized void run() { for (int i = 0; i< 5; i++) { try { System.out.println(Thread.currentThread().getName() + ": " + (count++)); Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } } } public class SyncTest { public static void main(String[] args) { SyncThread syncThread = new SyncThread(); Thread thread1 = new Thread(syncThread, "Thread1"); Thread thread2 = new Thread(syncThread, "Thread2"); thread1.start(); thread2.start(); } }
上面的代碼定義了一個SyncThread類,其中run()方法是同步方法,使用synchronized關(guān)鍵字將多個線程對count變量的訪問變?yōu)榛コ獾模WC了每次只有一個線程對count進行加1操作。在SyncTest類中,創(chuàng)建兩個線程同時使用同一個SyncThread實例進行操作,可以看到輸出結(jié)果是依次遞增的。
除了使用synchronized關(guān)鍵字,Java還提供了一些類似于Lock和Condition這樣的類來解決線程同步問題。在使用這些類時,需要注意線程鎖的釋放等問題,不建議初學(xué)者直接使用。