public class CASLockUtil { public static AtomicReference casLock = new AtomicReference<Thread>(); /** * 加锁 * @param waitMillis 重试时间,如果超过这个时间则放弃当前的锁Millis * @return */ public static boolean lock(long waitMillis){ long end = System.currentTimeMillis()+waitMillis; boolean isLock = casLock.compareAndSet(null,Thread.currentThread()); while (!isLock&&end> System.currentTimeMillis()){ isLock = casLock.compareAndSet(null,Thread.currentThread()); } //如果是0就无限尝试 while (waitMillis==0&&!isLock){ isLock = casLock.compareAndSet(null,Thread.currentThread()); } return isLock; } /** * //解锁 * @return */ public static boolean unLock(){ boolean isLock = casLock.compareAndSet(Thread.currentThread(),null); return isLock; } public static void main(String[] args) { new Thread(new Runnable() { @Override public void run() { try { boolean isLock = CASLockUtil.lock(1000); if(isLock){ System.out.println("线程1拿到锁休眠10秒"); Thread.sleep(10000); }else { System.out.println("线程1没有拿到锁"); } }catch (Exception e){ }finally { CASLockUtil.unLock(); } } }).start(); new Thread(new Runnable() { @Override public void run() { try { boolean isLock = CASLockUtil.lock(0); if(isLock){ System.out.println("线程2拿到锁休眠10秒"); Thread.sleep(10000); }else { System.out.println("线程2没有拿到锁"); } }catch (Exception e){ }finally { CASLockUtil.unLock(); } } }).start(); } }
利用AtomicReference的compareAndSet对当前线程对象进行加锁。测试结果
线程1拿到锁休眠10秒
线程2拿到锁休眠10秒
来源:oschina
链接:https://my.oschina.net/u/4039389/blog/4312642