显示锁 Lock
在Java 5.0之前,协调共享对象的访问时可以使用的机
制只有 synchronized 和 volatile 。Java 5.0 后增加了一些
新的机制,但并不是一种替代内置锁的方法,而是当内
置锁不适用时,作为一种可选择的高级功能。
ReentrantLock 实现了 Lock 接口,并提供了与
synchronized 相同的互斥性和内存可见性。但相较于
synchronized 提供了更高的处理锁的灵活性
解决多线程安全的方法:
1、同部代码块(synchronized )隐式
2、同部方法(synchronized )隐式
3、同步锁(Lock)显示
注意:需要通过过**lock()**方法上锁
必须通过**unlock()**方法进行释放锁
实例:
卖票问题
1public class TestLock { 2 public static void main(String[] args) { 3 4 Ticket t = new Ticket(); 5 6 new Thread(t,"1窗口").start(); 7 new Thread(t,"2窗口").start(); 8 new Thread(t,"3窗口").start(); 9 } 10 11} 12class Ticket implements Runnable{ 13 14 private int ticket = 100; 15 16 @Override 17 public void run() { 18 while(true){ 19 if(ticket >0){ 20 21 try { 22 Thread.sleep(400); 23 } catch (InterruptedException e) { 24 // TODO Auto-generated catch block 25 e.printStackTrace(); 26 } 27 28 System.out.println(Thread.currentThread().getName() + "进行卖票,剩余:" + --ticket); 29 30 } 31 } 32 } 33}
此时的线程是不安全的

对代码尽心修改:
1import java.util.concurrent.locks.Lock; 2import java.util.concurrent.locks.ReentrantLock; 3 4public class TestLock { 5 public static void main(String[] args) { 6 7 Ticket t = new Ticket(); 8 9 new Thread(t,"1窗口").start(); 10 new Thread(t,"2窗口").start(); 11 new Thread(t,"3窗口").start(); 12 } 13} 14class Ticket implements Runnable{ 15 16 private int ticket = 100; 17 private Lock lock = new ReentrantLock(); 18 19 @Override 20 public void run() { 21 while(true){ 22 //上锁 23 lock.lock(); 24 try { 25 if(ticket >0){ 26 try { 27 Thread.sleep(400); 28 } catch (InterruptedException e) { 29 // TODO Auto-generated catch block 30 e.printStackTrace(); 31 } 32 System.out.println(Thread.currentThread().getName() + "进行卖票,剩余:" + --ticket); 33 } 34 } finally { 35 //释放锁 36 lock.unlock(); 37 } 38 } 39 } 40}
此时可以有效的解决多线成的安全性问题