Java中的讀寫鎖是用于解決多線程訪問共享資源的常見問題。在并發(fā)編程中,如果多個線程同時訪問共享資源,很容易造成數(shù)據(jù)不一致或者死鎖。
Java中的讀寫鎖通過對共享資源的讀寫分離,實現(xiàn)了對共享資源的高效訪問。讀寫鎖可以同時允許多個線程進行讀操作,但是只能允許一個線程進行寫操作。這樣就能保證數(shù)據(jù)一致性和高并發(fā)性。
/** * 讀寫鎖示例 */ public class ReadWriteLockDemo { private int num = 0; private ReadWriteLock lock = new ReentrantReadWriteLock(); /** * 讀取操作 */ public void read() { lock.readLock().lock(); try { System.out.println("讀取num值:" + num); Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.readLock().unlock(); } } /** * 寫入操作 */ public void write() { lock.writeLock().lock(); try { System.out.println("寫入num值:" + (++num)); Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.writeLock().unlock(); } } /** * 測試讀寫鎖 */ public static void main(String[] args) { final ReadWriteLockDemo demo = new ReadWriteLockDemo(); // 創(chuàng)建10個讀線程 for (int i = 0; i< 10; i++) { new Thread(() ->{ demo.read(); }).start(); } // 創(chuàng)建1個寫線程 new Thread(() ->{ demo.write(); }).start(); } }
在代碼中,我們使用ReentrantReadWriteLock類創(chuàng)建了一個讀寫鎖。在read()方法中,我們使用lock.readLock().lock()獲取讀鎖,使用lock.readLock().unlock()釋放讀鎖。而在write()方法中,我們使用lock.writeLock().lock()獲取寫鎖,使用lock.writeLock().unlock()釋放寫鎖。
在測試代碼中,我們創(chuàng)建了10個讀線程和1個寫線程。由于是使用讀鎖,所有的10個讀線程可以同時進行讀操作。而當寫線程獲取寫鎖時,其它線程就會被阻塞。這樣就能保證線程安全和數(shù)據(jù)一致性。