JAVA synchronized 线程经典 生产者消费者 两个完全不同的实现的方式

package sell_ticket;

public class ThreadTicket {

      public static void main(String[] args) {
            MyThread m = new MyThread();
            Thread t1 = new Thread(m);
            Thread t2 = new Thread(m);
            Thread t3 = new Thread(m);
            t1.start();
            t2.start();
            t3.start();
        }
}

class MyThread implements Runnable{
    private int ticket=100;

//synchronized
    public void run(){
        while(true){
              try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
            // TODO Auto-generated catch block
                e.printStackTrace();
              }
            //用synchronized包起来,形成同步代码块,但后来发现用不用其实一样
            synchronized(this){
                if(ticket>0){
                    System.out.println(Thread.currentThread().getName()+"出售了"+ticket);
                    ticket--;
                }
            }

        }
    }

}

以上还有另一个写法,synchronized一个方法:

class Test implements Runnable
{
    //票的总数
    private int ticket=20;
    public void run()
    {
       //50只是用来循环,无意义
      for(int i=1;i<50;i++)
        {
            try {
                //休眠1s秒中,为了使效果更明显,否则可能出不了效果
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            this.sale();
        }
    }
    public synchronized void sale()
    {
            if(ticket>0)
            {
               //很有意思的一个发现,如果用System.out.println(Thread.currentThread().getName()+"号窗口卖出"+this.ticket--+"号票"); 哪怕不用synchronized,重复卖票的现像也会低很多
             
                System.out.println(Thread.currentThread().getName()+"号窗口卖出"+this.ticket+"号票");
                ticket--;
            }
    }

    public static void main(String args[])
    {
        Test mt=new Test();
        //基于火车票创建三个窗口
        new Thread(mt,"a").start();
        new Thread(mt,"b").start();
        new Thread(mt,"c").start();
    }
}

第二种,采用堆栈的方式:
 






				
时间: 2024-10-31 19:39:33

JAVA synchronized 线程经典 生产者消费者 两个完全不同的实现的方式的相关文章

java synchronized wait notify 生产者消费者死锁问题求解

问题描述 //仓库类publicclassWareHouse{//存货物的容器List<String>store=newArrayList<String>();publicWareHouse(){}//存货物的动作publicvoidstock(Stringproduct){synchronized(this){//往仓库中存一个货物System.out.println("卖家已经存入了货物:"+product+",通知等待得购买者");st

ruby线程实现生产者消费者问题示例(队列Queue实现线程同步)_ruby专题

Ruby线程实现经典的生产者消费者问题,用ruby中的Queue类实现线程同步问题. 复制代码 代码如下: require "thread"  puts "ProAndCon"  queue = Queue.new    #用队列Queue实现线程同步  producer = Thread.new do      10.times do |i|          sleep rand(i) # 让线程睡眠一段时间          queue << i 

java解决单缓冲生产者消费者问题示例_java

经典的生产者消费者问题模拟.此程序模拟最简单情形--单缓冲.为模拟实际情况,consume item和produce item时加了延时,可以通过修改延时模拟不同的生成消费速率. [code] [/co/** * single buffer consumer-producer problem. * by xu(xusiwei1236@163.com). * */public class ConsumerProducer {  static Object buffer = null;  stati

浅谈java线程中生产者与消费者的问题_java

一.概念 生产者与消费者问题是一个金典的多线程协作的问题.生产者负责生产产品,并将产品存放到仓库:消费者从仓库中获取产品并消费.当仓库满时,生产者必须停止生产,直到仓库有位置存放产品:当仓库空时,消费者必须停止消费,直到仓库中有产品. 解决生产者/消费者问题主要用到如下几个技术:1.用线程模拟生产者,在run方法中不断地往仓库中存放产品.2.用线程模拟消费者,在run方法中不断地从仓库中获取产品.3  . 仓库类保存产品,当产品数量为0时,调用wait方法,使得当前消费者线程进入等待状态,当有新

tomcat-java synchronized 线程

问题描述 java synchronized 线程 目前的我的这个同步方法是这样的,我查阅的一些资料是解释: synchronized()作用是:防止多个线程同一时间调用此代码块或者方法. 如果我多台服务器上的 tomcat ,在执行到这个方法的时候是什么情况? 解决方案 Synchronized只能锁定当前tomcat的方法: 因为其实现机制是可用共享的堆内存空间,多个tomcat之间就各用各的堆内存空间,所以在多个tomcat之间用同步是办不到实际的原子性操作的: 解决方法: 1.在数据库层

Java线程:并发协作-生产者消费者模型

实际上,准确说应该是"生产者-消费者-仓储"模型,离开了仓储,生产者消费者模型就显得没有说服力了. 对于此模型,应该明确一下几点: 1.生产者仅仅在仓储未满时候生产,仓满则停止生产. 2.消费者仅仅在仓储有产品时候才能消费,仓空则等待. 3.当消费者发现仓储没产品可消费时候会通知生产者生产. 4.生产者在生产出可消费产品时候,应该通知等待的消费者去消费. 此模型将要结合java.lang.Object的wait与notify.notifyAll方法来实现以上的需求.这是非常重要的. /

JAVA生产者消费者(线程同步)代码学习示例_java

一.问题描述 生产者消费者问题是一个典型的线程同步问题.生产者生产商品放到容器中,容器有一定的容量(只能顺序放,先放后拿),消费者消费商品,当容器满了后,生产者等待,当容器为空时,消费者等待.当生产者将商品放入容器后,通知消费者:当消费者拿走商品后,通知生产者. 二.解决方案 对容器资源加锁,当取得锁后,才能对互斥资源进行操作. 复制代码 代码如下: public class ProducerConsumerTest {     public static void main(String []

java 生产者消费者问题 并发问题的解决(转)

引言 生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,如下图所示,生产者向空间里存放数据,而消费者取用数据,如果不加以协调可能会出现以下情况: 生产者消费者图 存储空间已满,而生产者占用着它,消费者等着生产者让出空间从而去除产品,生产者等着消费者消费产品,从而向空间中添加产品.互相等待,从而发生死锁. 生产者消费者问题是研究多线程程序时绕不开的经典问题之一,它描述是有一块缓冲区作为仓库,生产者可以将产品放入仓库,消费者则可以从仓库中取走产品.解决生产者/

java 生产者消费者问题

引言 生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,如下图所示,生产者向空间里存放数据,而消费者取用数据,如果不加以协调可能会出现以下情况: 生产者消费者图 存储空间已满,而生产者占用着它,消费者等着生产者让出空间从而去除产品,生产者等着消费者消费产品,从而向空间中添加产品.互相等待,从而发生死锁. 生产者消费者问题是研究多线程程序时绕不开的经典问题之一,它描述是有一块缓冲区作为仓库,生产者可以将产品放入仓库,消费者则可以从仓库中取走产品.解决生产者/