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

——————————————————————

jdk1.5的lock代替synchronized,condition封装

Object对象里sleep,wait,notify ,notifyAll

——————————————————————

/*
  需求:
  写一个简单的多线程模拟买票的程序
  四个买票窗口,一共有100张票

*/
import java.util.concurrent.locks.*;
   class Tick implements Runnable{
         private static  int tick=100;
         private String window;
        //创建锁对象
        private Lock lock=new ReentrantLock();
       //通过锁对象来创建Condition对象
       private Condition con=lock.newCondition();
         public  void windowName(String window){
                       this.window=window;
         }
         public void show(Object obj){
            System.out.println(obj);
         }
         public void run(){
                //加锁
                lock.lock();
               try{
                while(tick>0){
                   //相当于以前的锁.sleep(1);
                    con.awaitNanos(1);
                     if(tick>0)
                        show(window+": "+tick--+" 号票");
                 }
               }catch(Exception e ){}
             finally{
                 show(window+": 票已卖完");
                 //解锁
                 lock.unlock();
             }
         }
   }

public class TicketDemo{
          public static void main(String args[]){

Tick tick0=new Tick();
               Tick tick1=new Tick();
               Tick tick2=new Tick();
               Tick tick3=new Tick();
               Thread t0=new Thread(tick0);
               Thread t1=new Thread(tick1);
               Thread t2=new Thread(tick2);
               Thread t3=new Thread(tick3);
               tick0.windowName("窗口1");
               tick1.windowName("窗口2");
               tick2.windowName("窗口3");
               tick3.windowName("窗口4");
               t0.start();
               t1.start();
               t2.start();
               t3.start();
          }

}

时间: 2024-12-05 16:39:15

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

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

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

C# 防止同时调用=========使用读写锁三行代码简单解决多线程并发的问题

http://www.jb51.net/article/99718.htm 本文主要介绍了C#使用读写锁三行代码简单解决多线程并发写入文件时提示"文件正在由另一进程使用,因此该进程无法访问此文件"的问题.需要的朋友可以参考借鉴 在开发程序的过程中,难免少不了写入错误日志这个关键功能.实现这个功能,可以选择使用第三方日志插件,也可以选择使用数据库,还可以自己写个简单的方法把错误信息记录到日志文件. 选择最后一种方法实现的时候,若对文件操作与线程同步不熟悉,问题就有可能出现了,因为同一个文

【小白的java成长系列】——多线程初识(多人买票问题)

本来这节内容是要到后面来说的,因为最近在弄并发的问题,推荐一本书<java并发编程实战>,深入的讲解了多线程问题的.本人最近也刚好在看这本书,还不错的~ 多线程的相关概念,就不用说了的,自己可以去网上查找,有一大堆关于它的讲解~ 先来看看买票的程序: package me.javen.thread.one; public class TicketDemo { public static void main(String[] args) { // 使用Thread类的方式 // TicketTh

java多线程编程(3)买票

1,买票非同步版本 http://www.cnblogs.com/anbylau2130/archive/2013/04/17/3025347.html很详细 1 public class 多线程2 { 2 3 /** 4 * @param args 5 */ 6 public static void main(String[] args) { 7 // TODO Auto-generated method stub 8 Runnable r=new mythread(); 9 Thread t

java2 多线程2 买票

/** * 这样买票会出现卖出超过100张票,把num静态化可以解决这个问题 */ private static void test1(){ System.out.println("开始卖票"+Thread.currentThread().getName()); Ticket ticket= new Ticket(); Thread t1=new Thread(ticket); Thread t2=new Thread(ticket); Thread t3=new Thread(tic

解决多线程并发问题

1.文件锁 如果对该表的更新或插入的操作,都会经过一个统一的文件,这种方式是可以解决的多进程并发的问题: 实现方式如下: public static function cbInventoryReserve() { $LOCK_FILE_PATH = $_SERVER['DOCUMENT_ROOT']."wmsinventoryapi/inventory/InventoryReserve.php"; $fp = fopen( $LOCK_FILE_PATH, "r"

你好,C++(37)上车的人请买票!6.3.3 用虚函数实现多态

6.3.3  用虚函数实现多态 在理解了面向对象的继承机制之后,我们知道了在大多数情况下派生类是基类的“一种”,就像“学生”是“人”类中的一种一样.既然“学生”是“人”的一种,那么在使用“人”这个概念的时候,这个“人”可以指的是“学生”,而“学生”也可以应用在“人”的场合.比如可以问“教室里有多少人”,实际上问的是“教室里有多少学生”.这种用基类指代派生类的关系反映到C++中,就是基类指针可以指向派生类的对象,而派生类的对象也可以当成基类对象使用.这样的解释对大家来说是不是很抽象呢?没关系,可以

Java学习笔记45(多线程二:安全问题以及解决原理)

线程安全问题以及解决原理: 多个线程用一个共享数据时候出现安全问题 一个经典案例: 电影院卖票,共有100座位,最多卖100张票,买票方式有多种,网上购买.自主售票机.排队购买 三种方式操作同一个共享数据,这时候会出现安全问题: 示例: package demo1; public class Tickets implements Runnable { private int ticket = 100; public void run(){ while(true){ if (ticket>0) {

多线程—卖票

import threadingimport timelist_ticket=[] #定义票池lock=threading.Lock() #获得多线程锁num=30#票数for i in range(1,num+1): #ticket_num="0"*(len(str(num))-len(str(i)))+str(i) #001,003,013 ticket_num=str(i).zfill(3) list_ticket.append(ticket_num)# print(list_t