同步锁问题的再深入


class Ticket implements Runnable {
    int num = 200;
    boolean flag = true;

    public void run() {
        if (flag) {
            while (true) {
                synchronized (this) {  //这里要和show方法同步的锁(对象)保持一致,实现同一共享数据。
                    if (num > 0) {
                        System.out.println(Thread.currentThread().getName() + "----" + num--);
                    }

                }
            }
        } else {
            while (true) {
                show();
            }
        }
    }

    public synchronized void show() {
        if (num > 0) {
            System.out.println(Thread.currentThread().getName() + "---.............." + num--);
        }
    }
}

class Demo1 {
    public static void main(String[] args) {
        Ticket t = new Ticket();
        Thread tt = new Thread(t);
        Thread ttt = new Thread(t);
        tt.start();
        t.flag = false;
        ttt.start();
    }
}

我们这里将另一个线程在show方法中执行,当方法里的所有代码都需要同步时,可以在方法中直接加synchronized。
非静态的方法在执行的时候需要被对象调用。所以它用的对象就是this,this代表当前对象。
静态的方法在执行时用当前class文件代表对象。

你可能感兴趣的:(同步锁问题的再深入)