Java中的同步機制是多線程編程中很常見的話題。同步使得多個線程可以同時訪問共享資源,但是需要注意一些問題,比如死鎖問題。
同步可以用于實現互斥訪問,以免多個線程同時修改同一個變量導致數據不一致。Java中提供synchronized關鍵字實現同步鎖。synchronized關鍵字可以修飾方法和代碼塊,對對象實現的同步鎖是以對象為鎖的。例如:
public synchronized void test(){ //同步代碼 }
除了方法之外,synchronized可以修飾代碼塊。下面的代碼塊同一時間只允許一個線程進入:
synchronized(obj){//obj是對象 //同步代碼 }
在多線程環境下,線程訪問資源的順序和時間是不可預測的。因此,同步操作需要注意死鎖問題。
什么是死鎖?它是由于多個線程互相持有對方需要的資源而相互等待,導致線程都被阻塞的情況。例如:
public class DeadLockDemo { private static Object lockA = new Object(); private static Object lockB = new Object(); public static void main(String[] args){ new Thread(new Runnable() { @Override public void run() { synchronized (lockA){ System.out.println("Thread1: hold lockA"); try { Thread.sleep(2000); } catch (InterruptedException e) { } System.out.println("Thread1: waiting lockB"); synchronized (lockB){ System.out.println("Thread1: hold lockA and lockB"); } } } }).start(); new Thread(new Runnable() { @Override public void run() { synchronized (lockB){ System.out.println("Thread2: hold lockB"); try { Thread.sleep(2000); } catch (InterruptedException e) { } System.out.println("Thread2: waiting lockA"); synchronized (lockA){ System.out.println("Thread2: hold lockB and lockA"); } } } }).start(); } }
上面的代碼中,兩個線程分別占用lockA和lockB,然后等待對方釋放鎖。因此,它們都被阻塞了,就陷入了死鎖。
為了避免死鎖,我們可以嘗試一些方式:
1. 盡量不要一次獲得多個鎖。
2. 嘗試使用定時鎖,及時釋放鎖資源。
3. 嘗試使用可重入鎖,避免重復使用鎖。
以上就是Java中的同步和死鎖問題。
上一篇java c s和b s
下一篇jquery 釘一下