java基础——同步方法

实现Runnable的同步方法

package synchronization.method;
/*
用同步方法解决实现Runnable的安全问题

@author zsben
@create 2020-01-03 13:48
*/

class WindowRun implements Runnable{

    private int ticket = 100;

    @Override
    public void run() {
        while (true) {
           show();
        }
    }

    private synchronized void show(){//用的那把锁就是this
        if (ticket > 0) {
            System.out.println(Thread.currentThread().getName() + ": " + ticket);
            ticket--;
        }
    }
}

public class WindowRunnableTest {
    public static void main(String[] args) {
        WindowRun windowRun = new WindowRun();

        Thread t1 = new Thread(windowRun);
        Thread t2 = new Thread(windowRun);
        Thread t3 = new Thread(windowRun);

        t1.start();
        t2.start();
        t3.start();
    }
}

继承Thread的同步方法

package synchronization.method;

/*
创建三个窗口买票,总票数为100张

同步方法解决总结:
    1.同步方法仍然需要同步锁,只是不需要显示声明
    2. 非静态(实现Runnable)的同步方法:同步监视器是this
       静态(继承Thread类)的同步方法:同步监视器是当前类本身
@author zsben
@create 2020-01-03 12:41
*/

class Window extends Thread{
    private static int ticket = 100;

    @Override
    public void run() {
        while(true) {
            show();
        }
    }
    private static synchronized void show(){//同步监视器就是Window.class
        try {
            sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        if (ticket > 0) {
            System.out.println(Thread.currentThread().getName() + ": " + ticket);
            ticket--;
        }
    }
}

public class WindowThreadTest {
    public static void main(String[] args) {
        Window t1 = new Window();
        Window t2 = new Window();
        Window t3 = new Window();

        t1.setName("窗口1");
        t2.setName("窗口2");
        t3.setName("窗口3");

        t1.start();
        t2.start();
        t3.start();
    }
}
原文地址:https://www.cnblogs.com/zsben991126/p/12148298.html