用于解决多线程安全问题有三种方式:
- 同步代码块(隐式锁,基于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 }