同步锁 Lock
-
用于解决线程安全问题的方式:
1.1
synchronized
:隐式锁
(1) 同步代码块
(2)同步方法
1.2Lock
同步锁:显示锁
(1) 需要通过lock()
方法上锁;
(2) 必须通过unlock()
方法释放锁。 -
ReentrantLock
实现了Lock
接口,并提供了与synchronized
相同的互斥性和内存可见性。但相较于synchronized
提供了更高的处理锁的灵活性。 -
示例:
import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class TestLock { public static void main(String[] args) { ThreadDemo td = new ThreadDemo(); new Thread(td).start(); new Thread(td).start(); new Thread(td).start(); } } class ThreadDemo implements Runnable{ private int ticket = 100; private Lock lock = new ReentrantLock(); @Override public void run() { while (true) { lock.lock(); try { if (ticket > 0) { Thread.sleep(200); System.out.println(Thread.currentThread().getName() + "号窗口,正在售票,余票为:" + --ticket); } else { break; } } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } } }