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多线程售票程序实例及synchronized理解

开始学习java编程,遇到到了线程同步的问题。

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

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

Java 多线程5:synchronized 关键字用法(修饰类,方法,静态方法,代码块)

在 多线程生成的原因(Java内存模型与i++操作解析) 中,介绍了Java的内存模型,从而可能导致的多线程问题。synchronized就是避免这个问题的解决方法之一。除了 synchronized...

Java 多线程:synchronized 关键字用法(修饰类,方法,静态方法,代码块)

前言 在 多线程生成的原因(Java内存模型与i++操作解析) 中,介绍了Java的内存模型,从而可能导致的多线程问题。synchronized就是避免这个问题的解决方法之一。除了 synchr...

java 多线程synchronized互斥锁demo

  • 2016年12月16日 14:34
  • 665B
  • 下载

多线程练习程序 之 模拟火车票售票系统01版

程序源码: http://pan.baidu.com/s/1pKF5vpL模拟火车票售票系统用来练习多线程再好不过了. 这是第01版,尽量简化难度,我们在之后的版本,一步一步完善. 本节,我们将...

多线程售票程序

多线程售票程序场景介绍现实生活中,火车站售票厅都是多个窗口同时售票的,同一张票只能被一位乘客所买,当然我们可以去任意一个窗口买票,所以这些票是这些窗口的共享资源,需要对共享的资源进行处理否则就会出现一...

java多线程模拟售票

1、随着电脑手机等智能设备的不断升级,我们的程序当然也得升级,假如一个8核的电脑,而你的程序没有使用的多线程开发,那岂不是浪费了其余的7核,真的是资源浪费啊。因此多线程开发还是必须得使用的。 2、多个...

用java多线程操作模拟售票系统

class Threadsale implements Runnable{ int tickets = 100; public void run(){ while(true){ if(t...

3-1-Java多线程-案例-售票&线程状态

售票案例线程状态 售票的动作需要被多个线程同时执行,所以要使用多线程技术 代码示例-线程不安全 代码 class Ticket implements Runnable{ private in...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java多线程售票程序中synchronized用法反思
举报原因:
原因补充:

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