同步锁Lock

用于解决多线程安全问题有三种方式:

  • 同步代码块(隐式锁,基于JVM)
  • 同步方法(隐式锁,基于JVM)
  • 同步锁(显式锁,jdk1.5后出现,相对于前两种方式,更加灵活)

下面通过一段程序来说明一下同步锁的简单使用。

 1 package com.ccfdod.juc;
 2 
 3 import java.util.concurrent.locks.Lock;
 4 import java.util.concurrent.locks.ReentrantLock;
 5 
 6 /**
 7  * 用于解决多线程安全问题的方式:
 8  * 1、同步代码块(synchronized):隐式锁,基于jvm
 9  * 2、同步方法(synchronized):隐式锁,基于jvm
10  * 3、同步锁Lock:出现于jdk1.5后,相对于前两种方式,更加灵活,显式锁
11  * 注意:这是一个显示锁,需要通过lock()方法上锁,必须通过unlock()方法进行释放锁,
12  *     因此使用有风险(存在一定的安全隐患),因为是通过方法来释放锁,所以要注意释放,一般将unlock()方法放置finally中
13  */
14 public class TestLock {
15 
16     public static void main(String[] args) {
17         Ticket ticket = new Ticket();
18         
19         new Thread(ticket, "1号窗口").start();
20         new Thread(ticket, "2号窗口").start();
21         new Thread(ticket, "3号窗口").start();
22     }
23 }
24 
25 class Ticket implements Runnable {
26     private int tick = 100;
27     
28     private Lock lock = new ReentrantLock();
29 
30     @Override
31     public void run() {
32         while(true) {
33             lock.lock();
34             try {
35                 if (tick > 0) {
36                     try {
37                         Thread.sleep(200);
38                     } catch (InterruptedException e) {
39                         e.printStackTrace();
40                     }
41                     System.out.println(Thread.currentThread().getName() + " 完成售票,余票为:" + --tick);
42                 }
43             } finally {
44                 lock.unlock();  //释放锁
45             }
46         }
47         
48     }
49 }

 

posted @ 2017-02-14 01:54  chunfulandu  阅读(290)  评论(0编辑  收藏  举报