synchronized (lock) 买票demo 线程安全

加锁防止多个线程执行同一段代码!

/** http://blog.51cto.com/wyait/1916898
 * @author
 * @since 11/10/2018
 * 某电影院目前正在上映贺岁大片,共有100张票,而它有3个售票窗口售票,请设计一个程序模拟该电影院售票.
 * 同步的特点:
 *      前提: 多个线程
 *      解决问题的时候要注意: 多个线程使用的是同一个锁对象
 * 同步的好处:同步的出现解决了多线程的安全问题。
 * 同步的弊端:当线程相当多时,因为每个线程都会去判断同步上的锁,这是很耗费资源的,无形中会降低程序的运行效率。
 */
public class SellTicketDemo {

    public static void main(String[] args) {
        SellTicket st = new SellTicket();//创建资源对象
        //创建三个线程对象
        new Thread(st, "窗口1").start();
        new Thread(st, "窗口2").start();
        new Thread(st, "窗口3").start();
    }

    public static class SellTicket implements Runnable {
        private int tickets = 10;//定义100张票
        private Object lock = new Object();//定义同一把锁
        @Override
        public void run() {
            while (true) {
                //t1,t2,t3都能走到这里
                //假设t1抢到CPU的执行权,t1就要进来
                //假设t2抢到CPU的执行权,t2就要进来,发现门是关着的,进不去。所以就等着。

                //门锁(开,关)
                synchronized (lock) { // 发现这里的代码将来是会被锁上的,所以t1进来后,就锁了。(关)
                    if (tickets > 0) {
                        try {
                            Thread.sleep(100);// t1就睡眠了
                            // 添加:每次卖票延迟100毫秒!
                            //不加锁会 出现问题:相同的票出现多次,还出现了负数的票
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        System.out.println(
                                Thread.currentThread().getName() + "正在出售第" + (tickets--) + "张票 ");
                        //窗口1正在出售第100张票
                    }
                }//t1就出来可,然后就开门。(开)
            }
        }
    }

}

http://blog.51cto.com/wyait/1916898

原文地址:https://www.cnblogs.com/hahajava/p/9773581.html

时间: 2024-08-03 19:51:26

synchronized (lock) 买票demo 线程安全的相关文章

买票问题-线程的同步

1 //买票问题 2 package ThreadL; 3 4 public class Thread9 { 5 public static void main(String[] args){ 6 Thread th1 = new Thread(new Thread9L(),"AAA"); 7 Thread th2 = new Thread(new Thread9L(),"BBBBBB"); 8 th1.start(); 9 th2.start(); 10 } 11

简单的多线程买票模拟程序(lock解决多线程存在大安全隐患)

—————————————————————— jdk1.5的lock代替synchronized,condition封装 Object对象里sleep,wait,notify ,notifyAll —————————————————————— /*  需求:  写一个简单的多线程模拟买票的程序  四个买票窗口,一共有100张票 */import java.util.concurrent.locks.*;   class Tick implements Runnable{         priv

Java 线程锁机制 -Synchronized Lock 互斥锁 读写锁

synchronized 是互斥锁: lock 更广泛,包含了读写锁 读写锁特点: 1)多个读者可以同时进行读2)写者必须互斥(只允许一个写者写,也不能读者写者同时进行)3)写者优先于读者(一旦有写者,则后续读者必须等待,唤醒时优先考虑写者) 互斥锁特点: 一次只能一个线程拥有互斥锁,其他线程只有等待 所谓互斥锁, 指的是一次最多只能有一个线程持有的锁. 在jdk1.5之前, 我们通常使用synchronized机制控制多个线程对共享资源的访问. 而现在, Lock提供了比synchronize

线程模拟买票

存在问题:这时候启动了四个线程,那么tickets是一个成员变量,也就是在一个线程对象中都维护了属于自己的tickets属性,那么就总共存在了四份. 解决方案一:tickets使用staitc修饰,使每个线程对象都是共享一份属性. 1.1 创建线程的方式二 创建线程的第二种方式.使用Runnable接口. 该类中的代码就是对线程要执行的任务的定义. 1:定义了实现Runnable接口 2:重写Runnable接口中的run方法,就是将线程运行的代码放入在run方法中 3:通过Thread类建立线

Java线程同步(synchronized)——卖票问题

卖票问题通常被用来举例说明线程同步问题,在Java中,采用关键字synchronized关键字来解决线程同步的问题. Java任意类型的对象都有一个标志位,该标志位具有0,1两种状态,其开始状态为1,当某个线程执行了synchronized(object)语句后,object对象的标志位变为0状态,直到执行完整个synchronized语句中的代码块后,该对象的标志位又回到1状态. 当一个线程执行到synchronized(object)语句的时候,先检查object对象的标志位,如果为0状态,

NSThread 买票

创建2个线程买票,涉及到临界资源保护. 创建线程代码如下: ticketsThreadone = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil]; [ticketsThreadone setName:@"Thread-1"]; [ticketsThreadone start]; 注意:线程的函数 run跑完后,这个线程就结束了,因此买票的函数应该是个死循环,才能实现多次买票 代码: #i

买票问题

/** * 买票问题 */ public class ThreadTrain1 implements Runnable { private int count = 10; private static Object o = new Object(); @Override public void run() { while (count>0){ try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(

简单的多线程买票模拟程序

/*  需求:  写一个简单的多线程模拟买票的程序  四个买票窗口,一共有100张票 */ class Tick implements Runnable{         private static  int tick=100;         private String window;         public  void windowName(String window){                 synchronized(Tick.class){              

排队买票

要求:假定总票数是100张        假设 有5个人排队卖票,同一时间只能有一个人买票        票卖出去之后,票数要减少 代码: /** * */ package com.niit.homework; /** * @author: Annie * @date:2016年6月16日 * @description:假定总票数是100张 假设 有5个人排队卖票,同一时间只能有一个人买票 票卖出去之后,票数要减少 */ public class TicketDemo implements Ru