楼主你好:
你的同步代码块里面的锁有问题,因为你用的是匿名对象,每次判断锁的时候,都是不同的对象。
因为同步代码块中的锁必须是同一个锁并且可以是任意锁,可以是this锁,也可以是.class文件。
所谓的锁也就是synchronized (锁){};中传的参数你可以把对象改为如下所示:- class Ticket implements Runnable {
- private int tic = 100;
- private Object obj = new Object(); //这里定义的代码,就是定义的锁对象
- public void run() {
- while (true) {
- synchronized (obj) { //这里就是装的锁对象,其实也可以不用定义锁对象,直接传个任意对象就行,如this或者某类的.class文件都可以,保证锁的唯一
- if (tic > 0) {
- try {
- Thread.sleep(10);// 出现-1、-2号票 有安全问题
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- System.out.println(Thread.currentThread().getName()
- + "ticket" + tic--);
- }
- }
- }
- }
- }
- public class TicketDemo {
- public static void main(String[] args) {
- Ticket t = new Ticket();
- Thread t1 = new Thread(t);
- Thread t2 = new Thread(t);
- Thread t3 = new Thread(t);
- Thread t4 = new Thread(t);
- t1.start();
- t2.start();
- t3.start();
- t4.start();
- }
- }
复制代码 希望可以帮助楼主。
|