java 5 ReadWriteLock
import java.util.ArrayList; import java.util.List; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; public class ReadWriteLockTest { private static List<String> list = new ArrayList<String>(); public static void main(String[] args) { for(int i = 0; i < 10; i++) { list.add("init - " + i); } new Thread(new Runnable() { public void run() { try { ReadWriteLockTest.add(); } catch (Exception e) { e.printStackTrace(); } } }).start(); new Thread(new Runnable() { public void run() { try { ReadWriteLockTest.get(); } catch (Exception e) { e.printStackTrace(); } } }).start(); } private static ReadWriteLock lock = new ReentrantReadWriteLock(); private static void add() throws Exception { for(int i = 0; i < 10; i++) { lock.writeLock().lock(); list.add("add-" + i); lock.writeLock().unlock(); System.out.println("add " + i); Thread.sleep(500); } } private static void get() throws Exception { lock.readLock().lock(); for(String str : list) { System.out.println("get- " + str); Thread.sleep(500); } lock.readLock().unlock(); } }
上面有2个线程同时对list变量读写,如果不使用读写锁,则程序会抛出异常。
多个读锁不互斥,读锁也写锁互斥,写锁与写锁互斥。
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步