java多线程售票程序中synchronized用法反思
2013-12-05 13:10
716 查看
通过对以下两个例子,谈谈对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 得到此对象的对象锁,这样就不会得到同一个票被卖多次的情况.
代码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多线程的例子及synchronized关键字锁定对象的用法
- Java多线程,线程同步synchronized,线程死锁【线程池常规用法】多线程并发处理
- linux多线程编程之java售票程序的移植
- Java多线程实现简单的售票程序
- java 多线程 同步 synchronized 的个人理解和用法
- Java 多线程:synchronized 关键字用法(修饰类,方法,静态方法,代码块)
- Java:多线程,线程同步,synchronized关键字的用法(同步代码块、非静态同步方法、静态同步方法)
- java多线程 synchronized关键字的一些用法
- Java 多线程:synchronized 关键字用法
- Java多线程程序中synchronized修饰方法的使用实例
- 黑马程序员-19-java基础-多线程(2)-死锁与线程间通信(synchronized与Lock的区别及各自用法)
- Java多线程实现简单的售票程序
- Java多线程模拟售票程序,及线程安全问题
- java多线程synchronized,wait,notify的大致用法
- Java 多线程:synchronized 关键字 3ff0 用法(修饰类,方法,静态方法,代码块)
- java中synchronize关键字的理解 在多线程环境下的应用: synchronized 关键字,它包括两种用法:synchronized 方法和 synchronized 块。 1. syn
- Java多线程实现简单的售票程序
- 黑马程序员——java多线程的几种实现方法及多窗口售票小程序
- java多线程实现卖票程序(synchronized)