java多线程售票程序中synchronized用法反思

原创 2013年12月05日 13:10:18

   通过对以下两个例子,谈谈对synchronized的理解:

      代码1:

public class Ticket implements Runnable {
 private static int  num=100;
 public static void main(String[] args) {
 
  Thread t1=new Thread(new Ticket(),"t1");
  Thread t2=new Thread(new Ticket(),"t2");
  Thread t3=new Thread(new Ticket(),"t3");
  Thread t4=new Thread(new Ticket(),"t4");
  Thread t5=new Thread(new Ticket(),"t5");
  t1.start();
  t2.start();
  t3.start();
  t4.start();
  t5.start();
 }
 synchronized void getTicket(String name){
  if(num>0){
   System.out.println(name+"-----"+num);
   num--;
  }
  try {
   Thread.sleep(500);
  } catch (InterruptedException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  }
 public void run() {
  while(num>0)
   this.getTicket(Thread.currentThread().getName());
 }
}

输出结果为什么同一张票被卖出多次,而有的票没卖出,例如:

 

 

代码2:

public class Sell  implements Runnable{
     private int total;
     public  Sell(int total) {
  this.total=total;
 }
 @Override
 public void run() {
  // TODO Auto-generated method stub
  
  while (total>0) {
   System.out.println("tickets" +total+"is sell");
   synchronized  (new Integer(total)) {
    if (total>0) {
     total--;
       }
    try {
     Thread.sleep(2000);
    } catch (InterruptedException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
  System.out.println("tickets  is selled");
    
   }
   
   
  }
  
  
                       }
  
 
 
 
 public static void main(String[] args) {
  int total=10;
  Sell sell=new Sell(total);
  Thread thread1=new Thread(sell);
  Thread thread2=new Thread(sell);
  Thread thread3=new Thread(sell);
  Thread thread4=new Thread(sell);
  thread1.start();
  thread2.start();
  thread3.start();
  thread4.start();
  
 }
 
}

    synchronized 锁的是对象,例子一中,其实也相当于得到了Sell 对象的对象锁,所以同步的只是对象对方法的调用,而售票时最重要的是对票的同步,为了使tickets 同步,可以将票数封装成对象,使synchronized 得到此对象的对象锁,这样就不会得到同一个票被卖多次的情况.

 

 

 

 

java多线程卖票-教你简单易懂三步骤

同步: 1、是否多个线程同时在运行 2、多个线程是否同时用同一块资源(不然怎么叫共享资源) 3、同步的时候确定是否是唯一的锁(为了不出现安全性问题,所以就得将共享的资源进行同步(synchronize...
  • zhujason9107
  • zhujason9107
  • 2016年08月22日 11:03
  • 888

线程(售票小程序)

第一种方法:继承Thread类 /* 问题描述: 简单的卖票程序,多窗口卖票。 */ //继承Thread类,复写run方法 class Ticket extends Thread { pr...
  • u012369373
  • u012369373
  • 2015年11月13日 14:29
  • 279

Java多线程4—线程同步问题+火车票售票系统

在上一篇文章中写到了许多线程共享同一数据,这种情况在现实的生活中也是经常发生的,比如火车站的火车票售票系统。火车票售票系统是一个常年运行的系统,为了满足乘客的需求,我们不能只设一个窗口,必须设很多的售...
  • mengxiangyue
  • mengxiangyue
  • 2011年10月13日 19:44
  • 19890

Java多线程模拟售票程序,及线程安全问题

Java中线程部分知识中,售票程序非常经典。程序中也有一些问题存在!  需求:模拟3个窗口同时在售100张票。 问题1:为什么100张票被卖出了300张票? 原因:因为tickets是非静态的,...
  • sy7571871
  • sy7571871
  • 2017年05月02日 20:54
  • 1019

Java多线程实现简单的售票程序

设计一个多线程程序如下:设计一个火车售票模拟程序。假如火车站要有100张火车票要卖出,现在有5个售票点同时售票,用5个线程模拟这5个售票点的售票情况 1、要求打印出每个售票点所卖出的票号 ...
  • qq_35619711
  • qq_35619711
  • 2017年05月09日 11:48
  • 827

java多线程实现售票

package com.gxk.thread; class ticketThread extends Thread { private static int ticket = 50; priv...
  • gukunkun
  • gukunkun
  • 2016年11月27日 19:40
  • 1299

关于多线程中synchronized的使用位置

在练习多线程之售票的时候,对于synchronized的使用有些困惑,因为我是用以下代码: public class ThreadDemo5 { /** * @param args */ ...
  • rockpk008
  • rockpk008
  • 2016年12月23日 23:02
  • 396

Lesson_for_java_day21--java的多线程练习(ATM存取款机、多窗口卖票系统、5人赛跑)

一、ATM存取款机: 二、多窗口卖票系统:
  • u013233075
  • u013233075
  • 2014年05月04日 16:02
  • 944

Java多线程应用之火车站售票

在我们的现实生活中,去火车站买票是一件很平常的事,但是你们想过吗,比如我们从一个售票处买了一张票的话,那么其他的售票点就不能找到这张票了,这样就可以保证每个人买的票不会一样,这是通过java的多线程功...
  • Story__struggle
  • Story__struggle
  • 2016年08月11日 12:52
  • 1083

Java多线程售票问题

1、代码 public class Test { public static void main(String[] args) { Tickets tickets = new Ticke...
  • vinegar93
  • vinegar93
  • 2016年05月19日 11:01
  • 1145
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java多线程售票程序中synchronized用法反思
举报原因:
原因补充:

(最多只允许输入30个字)