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