package locks; import java.util.ArrayList; import java.util.List; import java.util.Random; import java.util.concurrent.locks.Lock; public class LockTest { private static final int threadInitNumber = 10; private static final Lock lock = new java.util.concurrent.locks.ReentrantLock(); private List<String> list = new ArrayList<String>(); public static void main(String[] args){ final LockTest lockTest = new LockTest(); for(int i=0;i<threadInitNumber;i++){ new Thread(new Runnable(){ @Override public void run() { lockTest.insert(Thread.currentThread()); } }).start(); } } public void insert(Thread thread){ lock.lock(); //获取锁 try{ System.out.println(thread.getName() + "获得了锁..."); list.add(String.valueOf(new Random().nextInt(10))); }finally{ System.out.println(thread.getName() + "释放锁..."); lock.unlock(); } } }
package locks; import java.util.ArrayList; import java.util.List; import java.util.Random; import java.util.concurrent.locks.Lock; public class TryLockTest { private static final int threadInitNumber = 10; private static final Lock lock = new java.util.concurrent.locks.ReentrantLock(); private List<String> list = new ArrayList<String>(); public static void main(String[] args){ final TryLockTest lockTest = new TryLockTest(); for(int i=0;i<threadInitNumber;i++){ new Thread(new Runnable(){ @Override public void run() { try { lockTest.insert(Thread.currentThread()); } catch (InterruptedException e) { e.printStackTrace(); System.out.println(Thread.currentThread() + "线程被中断..."); } } }).start(); } } public void insert(Thread thread) throws InterruptedException{ //获取锁 //注意,如果需要正确中断等待锁的线程,必须将获取锁放在外面,然后将InterruptedException抛出 lock.lockInterruptibly(); try{ System.out.println(thread.getName() + "获得了锁..."); while(true){ list.add(String.valueOf(new Random().nextInt(10))); } }finally{ System.out.println(thread.getName() + "释放锁..."); lock.unlock(); } } }
package locks; import java.util.ArrayList; import java.util.List; import java.util.Random; import java.util.concurrent.locks.Lock; public class LockInterruptiblyTest { private static final int threadInitNumber = 10; private static final Lock lock = new java.util.concurrent.locks.ReentrantLock(); private List<String> list = new ArrayList<String>(); public static void main(String[] args){ final LockInterruptiblyTest lockTest = new LockInterruptiblyTest(); for(int i=0;i<threadInitNumber;i++){ new Thread(new Runnable(){ @Override public void run() { lockTest.insert(Thread.currentThread()); } }).start(); } } public void insert(Thread thread){ //获取锁 if(lock.tryLock()){ try{ System.out.println(thread.getName() + "获得了锁..."); list.add(String.valueOf(new Random().nextInt(10))); }finally{ System.out.println(thread.getName() + "释放锁..."); lock.unlock(); } } //未获取锁 else{ System.out.println("未获取锁"); } } }