public interface Lock { /** * Acquires the lock. */ void lock(); /** * Acquires the lock unless the current thread is * {@linkplain Thread#interrupt interrupted}. */ void lockInterruptibly() throws InterruptedException; /** * Acquires the lock only if it is free at the time of invocation. */ boolean tryLock(); /** * Acquires the lock if it is free within the given waiting time and the * current thread has not been {@linkplain Thread#interrupt interrupted}. */ boolean tryLock(long time, TimeUnit unit) throws InterruptedException; /** * Releases the lock. */ void unlock(); }
package com.brickworkers; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class LockTest { private Lock lock = new ReentrantLock(); //需要参与同步的方法 private void method(Thread thread){ lock.lock(); try { System.out.println("线程名" thread.getName() "获得了锁"); }catch(Exception e){ e.printStackTrace(); } finally { System.out.println("线程名" thread.getName() "释放了锁"); lock.unlock(); } } public static void main(String[] args) { LockTest lockTest = new LockTest(); //线程1 Thread t1 = new Thread(new Runnable() { @Override public void run() { lockTest.method(Thread.currentThread()); } }, "t1"); Thread t2 = new Thread(new Runnable() { @Override public void run() { lockTest.method(Thread.currentThread()); } }, "t2"); t1.start(); t2.start(); } } //执行情况:线程名t1获得了锁 // 线程名t1释放了锁 // 线程名t2获得了锁 // 线程名t2释放了锁
package com.brickworkers; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class LockTest { private Lock lock = new ReentrantLock(); //需要参与同步的方法 private void method(Thread thread){ /* lock.lock(); try { System.out.println("线程名" thread.getName() "获得了锁"); }catch(Exception e){ e.printStackTrace(); } finally { System.out.println("线程名" thread.getName() "释放了锁"); lock.unlock(); }*/ if(lock.tryLock()){ try { System.out.println("线程名" thread.getName() "获得了锁"); }catch(Exception e){ e.printStackTrace(); } finally { System.out.println("线程名" thread.getName() "释放了锁"); lock.unlock(); } }else{ System.out.println("我是" Thread.currentThread().getName() "有人占着锁,我就不要啦"); } } public static void main(String[] args) { LockTest lockTest = new LockTest(); //线程1 Thread t1 = new Thread(new Runnable() { @Override public void run() { lockTest.method(Thread.currentThread()); } }, "t1"); Thread t2 = new Thread(new Runnable() { @Override public void run() { lockTest.method(Thread.currentThread()); } }, "t2"); t1.start(); t2.start(); } } //执行结果: 线程名t2获得了锁 // 我是t1有人占着锁,我就不要啦 // 线程名t2释放了锁
/** * Sync object for non-fair locks */ static final class NonfairSync extends Sync { private static final long serialVersionUID = 7316153563782823691L; /** * Performs lock. Try immediate barge, backing up to normal * acquire on failure. */ final void lock() { if (compareAndSetState(0, 1)) setExclusiveOwnerThread(Thread.currentThread()); else acquire(1); } protected final boolean tryAcquire(int acquires) { return nonfairTryAcquire(acquires); } } /** * Sync object for fair locks */ static final class FairSync extends Sync { private static final long serialVersionUID = -3000897897090466540L; final void lock() { acquire(1); } /** * Fair version of tryAcquire. Don't grant access unless * recursive call or no waiters or is first. */ protected final boolean tryAcquire(int acquires) { final Thread current = Thread.currentThread(); int c = getState(); if (c == 0) { if (!hasQueuedPredecessors() && compareAndSetState(0, acquires)) { setExclusiveOwnerThread(current); return true; } } else if (current == getExclusiveOwnerThread()) { int nextc = c acquires; if (nextc < 0) throw new Error("Maximum lock count exceeded"); setState(nextc); return true; } return false; } }
public ReentrantLock() { sync = new NonfairSync();//默认非公平锁 }
String str1="qwe"; String str2="asd"; String str3=str1 str2;
StringBuffer sb = new StringBuffer(); sb.append("qwe"); sb.append("asd");