线程锁主要通过关键字synchronized()来实现的
在你所开的线程里加上synchronized(锁)然后用同一把锁,就可以实现多线程中,限制多个线程对同一对象的操作时不会出现重复操作。
就像卖票窗口一样,多个窗口像多个线程,如果不加锁那么可能有两个窗口卖出了同一张票,线程锁就是为防止出现这样的情况而出现的,比如1号窗口卖001号票的时候,别的窗口要等到1号窗口操作完以后才能继续对票数进行操作。
再贴一个以前写的售票例子给你看看
- package cn.itcast.thread;
- /*
- * 需求:铁路售票,一共100张,通过四个窗口卖完.
- */
- public class Demo12_Tickets {
- /**
- * @param args
- */
- public static void main(String[] args) {
- new TicketsSeller().start();
- new TicketsSeller().start();
- new TicketsSeller().start();
- new TicketsSeller().start();
- /*TicketsSeller ts1 = new TicketsSeller();
- ts1.start(); //多次启动一个线程是非法的
- ts1.start();
- ts1.start();
- ts1.start();*/
- }
- }
- class TicketsSeller extends Thread {
- private static int tickets = 100;
- //private static Object obj = new Object();
- public void run() {
- while (true) {
- synchronized (TicketsSeller.class) {
- if (tickets <= 0)
- break;
- try {
- Thread.sleep(10);// 1234
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- System.out.println(getName() + "------------这是第" + tickets--
- + "号票");// tickets = tickets - 1
- }
- }
- }
- }
复制代码 |