有个作业要求实现多个售票站卖火车票,我想把票设为静态变量,然后通过一个类方法来取票来保证同步,但是给类方法上锁以后,不同实例的线程取票时还会出错,卖出第-1张票,请问问题出在哪里呢?是类方法的调用方式有问题么?
代码如下:
public class Tickets extends Thread{
private static int tickets=100;
public static synchronized void sellOne(String name){
System.out.println(name+"_________"+(tickets--));
}
public void run(){
while(tickets>0)
{
String name=Thread.currentThread().getName();
sellOne(name);
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new Tickets().start();
new Tickets().start();
new Tickets().start();
new Tickets().start();
}}
代码如下:
public class Tickets extends Thread{
private static int tickets=100;
public static synchronized void sellOne(String name){
System.out.println(name+"_________"+(tickets--));
}
public void run(){
while(tickets>0)
{
String name=Thread.currentThread().getName();
sellOne(name);
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new Tickets().start();
new Tickets().start();
new Tickets().start();
new Tickets().start();
}}
while (tickets > 0) {
System.out.println(name + "_________" + (tickets--));
}
} public void run() {
String name = Thread.currentThread().getName();
sellOne(name);
}
这样应该ok了
private int ticket = 100;
// 在java中所有的对象都是一把锁
//private Object obj = new Object();
public void run() {
while (ticket!=0) {
sell();
/*
* //枷锁 synchronized (obj) { if (ticket > 0) { try {
* Thread.sleep(30); } catch (InterruptedException e) {
* e.printStackTrace(); }
* System.out.println(Thread.currentThread().getName() + "卖出第" +
* ticket + "张"); ticket--; }
*/
}
} public synchronized void sell() {
if (ticket > 0) {
try {
Thread.sleep(30);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "卖出第"
+ ticket + "张");
ticket--;
}
}
}
package comticket;public class Test {
public static void main(String[] args) {
//创建对象
NewThreadTicket ntt = new NewThreadTicket();
//创建四个线程
new Thread(ntt).start();
new Thread(ntt).start();
new Thread(ntt).start();
new Thread(ntt).start();
}
}
if(tickets>0)
System.out.println(name+"_________"+(tickets--));
}