本文共 1731 字,大约阅读时间需要 5 分钟。
解决:两种方法
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.同步方法
一般不用 因为用了线程就没有意义了转载地址:http://fbhai.baihongyu.com/