动手实现一个同步器(AQS)
在多线程情景下,如果不会某一共享变量采取一些同步机制,很可能发生数据不安全现象,比如购买车票时,当多个人购买时,不加锁就会产生多人买同一张票的现象,显然这是不可取的。所以要有一种同步机制,在某一时刻只能有一个线程处理该共享变量。 同步器的加锁 我将自己实现的同步器成为RoadAQS. 主要变量如下: //当前锁的状态,1表示加锁,0表示未加锁 private volatile int state = 0; private final static Unsafe unsafe = UnsafeInstance.reflectUnsafe(); //state在内存中的偏移量 private final static long stateOffset; //当前持有锁的线程 private Thread lockHoder; //是一个线程安全的队列,记录等待获取锁的线程 private ConcurrentLinkedQueue<Thread> waiters = new ConcurrentLinkedQueue<>(); static { try { stateOffset = unsafe.objectFieldOffset(RoadAQS.class.getDeclaredField("state")); } catch (NoSuchFieldException e) {