证明同步函数使用的this锁

当多个线程操作统一成员变量或者静态变量,在做写的操作时就会发送线程安全问题,做读的操作不会发生线程安全问题。防止线程安全问题可以使用同步代码块(使用的时明锁),同步函数(使用的是this锁),静态同步函数(使用的字节码文件及类.class)

证明同步函数使用的this锁 一个线程使用同步代码,一个线程使用同步函数,如果使用的不是同一把锁则会发生线程安全问题

package www.it.com.thread;

/**
 * @author wangjie
 * @date 2019/11/21 11:42
 * @description 证明同步函数使用的是this锁 一个线程使用代码块,一个使用同步函数
 * @company 石文软件有限公司
 */
public class SynchronizedDemo implements Runnable {
    private Integer count = 100;
    private boolean flag = true;
    //自定义锁
    private Object object = new Object();
    @Override
    public void run() {
        if (flag) {
            while (true) {
                synchronized (object) {
                    if (count > 0) {
                        try {
                            Thread.sleep(40);
                        } catch (Exception e) {

                        }
                        System.out.println(Thread.currentThread().getName() + ",出售 第" + (100 - count + 1) + "张票.");
                        count--;
                    }
                }
            }
        } else {
            while (true) {
                sale();
            }
        }

    }


    public synchronized void sale() {
        if (count > 0) {
            try {
                Thread.sleep(40);
            } catch (Exception e) {

            }
            System.out.println(Thread.currentThread().getName() + ",出售 第" + (100 - count + 1) + "张票.");
            count--;
        }

    }


    public static void main(String[] args) throws InterruptedException {
        SynchronizedDemo synchronizedDemo = new SynchronizedDemo();
        Thread thread1 = new Thread(synchronizedDemo, "线程一");
        Thread thread2 = new Thread(synchronizedDemo, "线程二");
        thread1.start();
        Thread.sleep(100);
        synchronizedDemo.flag = false;
        thread2.start();
    }

}

当同步代码块使用object锁时运行发生线性安全问题

将同步代码块变成this锁,因为和同步函数使用的是同一把锁this,所以不会发生线程安全问题

posted @ 2019-12-19 18:04  求知若渴的蜗牛  阅读(191)  评论(1编辑  收藏  举报