解决:两种方法
1同步快
import java.util.Random;
public class Test13 {
/**
* @param args
* 多线程带来的数据不一致
* 解决办法 同步机制 1 同步块 2 同步方法(不推荐)
*/
public static void main(String[] args) {
ShellTickOp sto=new ShellTickOp(30);
Thread counter1=new Thread(sto,"张三 ");
Thread counter2=new Thread(sto,"李四");
Thread counter3=new Thread(sto,"王五");
counter1.start();
counter2.start();
counter3.start();
}
}
class ShellTickOp implements Runnable{
int tickets;
Random r=new Random();
public ShellTickOp(int tickets){
this.tickets=tickets;
}
@Override
public void run() {
// while(true){
//
// if(tickets>0){
//
// try {
// Thread.sleep(800);
// System.out.println(Thread.currentThread().getName()+"在shell第"+(tickets--)+"张票");
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
//
// }else {
// return;
// }
//
这里输出到负数了 0 -1 -2:
// }
// 解决办法 加入同步块
while(true){
synchronized(this){ // 参数是一个对象 任何对象都行 一般用当前对象 用来做对象锁 一个线程进来后就 锁上
if(tickets>0){
try {
Thread.sleep(800);
System.out.println(Thread.currentThread().getName()+"在shell第"+(tickets--)+"张票");
} catch (InterruptedException e) {
e.printStackTrace();
}
}else {
return;
}
}
}
}
}
2.同步方法
一般不用 因为用了线程就没有意义了