Lock
1
| import java.util.concurrent.locks.Lock
|
Lock实现提供了比使用synchronized方法和语句可获得的更加广泛的锁定操作。
Lock接口中的方法:
- void lock() 获取锁
- void unlock() 释放锁
1 2
| import java.util.concurrent.locks.ReentrantLock;
|
使用步骤
- 在成员位置创建一个ReentrantLock对象
- 在可能会出现安全问题的代码前调用Lock接口中的方法lock获取锁
- 在可能会出现安全问题的代码后调用Lock接口中的方法unLock释放锁
卖票案例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock;
public class DemoRunnableImpl implements Runnable { private static int ticket = 100; private Lock l = new ReentrantLock(); @Override public void run() { while(true){ l.lock(); if(ticket>0){ try { System.out.println("线程 "+ Thread.currentThread().getName() +" 出售第" + ticket + "张票"); Thread.sleep(1); ticket--; } catch (InterruptedException e) { e.printStackTrace(); }finally { l.unlock(); } }else{ l.unlock(); break; } } } }
|
1 2 3 4 5 6 7 8 9 10
| public class Main { public static void main(String[] args) { DemoRunnableImpl stri = new DemoRunnableImpl(); new Thread(stri).start(); new Thread(stri).start(); new Thread(stri).start(); new Thread(stri).start(); new Thread(stri).start(); } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
| // 结果: 线程 Thread-0 出售第100张票 线程 Thread-0 出售第99张票 线程 Thread-0 出售第98张票 线程 Thread-0 出售第97张票 线程 Thread-0 出售第96张票 线程 Thread-0 出售第95张票 线程 Thread-0 出售第94张票 线程 Thread-0 出售第93张票 线程 Thread-0 出售第92张票 线程 Thread-0 出售第91张票 线程 Thread-0 出售第90张票 线程 Thread-0 出售第89张票 线程 Thread-0 出售第88张票 线程 Thread-0 出售第87张票 线程 Thread-0 出售第86张票 线程 Thread-0 出售第85张票 线程 Thread-0 出售第84张票 线程 Thread-0 出售第83张票 线程 Thread-0 出售第82张票 线程 Thread-0 出售第81张票 线程 Thread-0 出售第80张票 线程 Thread-0 出售第79张票 线程 Thread-0 出售第78张票 线程 Thread-0 出售第77张票 线程 Thread-0 出售第76张票 线程 Thread-0 出售第75张票 线程 Thread-0 出售第74张票 线程 Thread-0 出售第73张票 线程 Thread-0 出售第72张票 线程 Thread-0 出售第71张票 线程 Thread-0 出售第70张票 线程 Thread-0 出售第69张票 线程 Thread-0 出售第68张票 线程 Thread-0 出售第67张票 线程 Thread-0 出售第66张票 线程 Thread-0 出售第65张票 线程 Thread-0 出售第64张票 线程 Thread-0 出售第63张票 线程 Thread-0 出售第62张票 线程 Thread-0 出售第61张票 线程 Thread-0 出售第60张票 线程 Thread-0 出售第59张票 线程 Thread-0 出售第58张票 线程 Thread-0 出售第57张票 线程 Thread-0 出售第56张票 线程 Thread-0 出售第55张票 线程 Thread-0 出售第54张票 线程 Thread-0 出售第53张票 线程 Thread-0 出售第52张票 线程 Thread-0 出售第51张票 线程 Thread-0 出售第50张票 线程 Thread-0 出售第49张票 线程 Thread-0 出售第48张票 线程 Thread-0 出售第47张票 线程 Thread-0 出售第46张票 线程 Thread-0 出售第45张票 线程 Thread-0 出售第44张票 线程 Thread-0 出售第43张票 线程 Thread-0 出售第42张票 线程 Thread-0 出售第41张票 线程 Thread-0 出售第40张票 线程 Thread-0 出售第39张票 线程 Thread-0 出售第38张票 线程 Thread-0 出售第37张票 线程 Thread-0 出售第36张票 线程 Thread-0 出售第35张票 线程 Thread-1 出售第34张票 线程 Thread-1 出售第33张票 线程 Thread-1 出售第32张票 线程 Thread-1 出售第31张票 线程 Thread-1 出售第30张票 线程 Thread-1 出售第29张票 线程 Thread-1 出售第28张票 线程 Thread-1 出售第27张票 线程 Thread-1 出售第26张票 线程 Thread-1 出售第25张票 线程 Thread-1 出售第24张票 线程 Thread-1 出售第23张票 线程 Thread-1 出售第22张票 线程 Thread-1 出售第21张票 线程 Thread-1 出售第20张票 线程 Thread-1 出售第19张票 线程 Thread-1 出售第18张票 线程 Thread-3 出售第17张票 线程 Thread-3 出售第16张票 线程 Thread-3 出售第15张票 线程 Thread-3 出售第14张票 线程 Thread-3 出售第13张票 线程 Thread-3 出售第12张票 线程 Thread-3 出售第11张票 线程 Thread-3 出售第10张票 线程 Thread-3 出售第9张票 线程 Thread-3 出售第8张票 线程 Thread-3 出售第7张票 线程 Thread-3 出售第6张票 线程 Thread-3 出售第5张票 线程 Thread-3 出售第4张票 线程 Thread-3 出售第3张票 线程 Thread-3 出售第2张票 线程 Thread-3 出售第1张票
|
Lock锁方法摘要
| 方法摘要 |
|
void |
lock() 获取锁。 |
void |
lockInterruptibly() 如果当前线程未被中断,则获取锁。 |
Condition |
newCondition() 返回绑定到此 Lock 实例的新 Condition 实例。 |
boolean |
tryLock() 仅在调用时锁为空闲状态才获取该锁。 |
boolean |
tryLock(long time, TimeUnit unit) 如果锁在给定的等待时间内空闲,并且当前线程未被中断,则获取锁。 |
void |
unlock() 释放锁。 |