Java 基础(同步方法解决线程安全问题)

同步方法解决线程安全问题

如果操作共享数据的代码完整的声明在一个方法中,我们不妨将此方法声明同步的。

同步方法的总结:
1.同步方法仍然涉及到同步监视器,只是不需要我们显式的声明。
2.非静态的同步方法,同步监视器是:this
静态的同步方法,同步监视器是:当前类本身

使用实现Runnable接口创建多线程

package com.klvchen.java;

class Window3 implements Runnable{
    private int ticket = 100;

    boolean isFlag = true;

    @Override
    public void run() {
        while (isFlag){
            show();

        }
    }

    private synchronized void show(){ //同步监视器:this
            if (ticket > 0){
                try {
                    Thread.sleep(100);
                }catch (InterruptedException e){
                    e.printStackTrace();
                }

                System.out.println(Thread.currentThread().getName() + ":卖票,票号为:" + ticket);
                ticket--;
            }else {
                isFlag = false;
            }

    }
}
public class WindowTest3 {
    public static void main(String[] args) {
        Window3 w = new Window3();

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

        t1.setName("线程1");
        t2.setName("线程2");
        t3.setName("线程3");

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

使用继承Thread类创建多线程

package com.klvchen.java;

class Window4 extends Thread{

    private static int ticket = 100;

    private static boolean isFlag = true;

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

    private static synchronized void show(){//同步监视器: Window4.class
        //private synchronized void show(){ //同步监视器: t1,t2,t3,此种解决方式不正确
        if (ticket > 0){
            try {
                Thread.sleep(100);
            }catch (InterruptedException e){
                e.printStackTrace();
            }

            System.out.println(Thread.currentThread().getName() + ": 卖票, 票号为: " + ticket);
            ticket--;
        }else {
            isFlag = false;
        }
    }
}

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

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

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