zoukankan      html  css  js  c++  java
  • 证明同步函数使用的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,所以不会发生线程安全问题

    小蘑菇
  • 相关阅读:
    图上两点之间的第k最短路径的长度 ACM-ICPC 2018 沈阳赛区网络预赛 D. Made In Heaven
    ACM-ICPC 2018 徐州赛区网络预赛 B. BE, GE or NE
    poj 1986
    ACM-ICPC 2018 徐州赛区网络预赛 A. Hard to prepare
    ACM-ICPC 2018 徐州赛区网络预赛 G. Trace
    hdu 5533
    ACM Changchun 2015 L . House Building
    ACM Changchun 2015 J. Chip Factory
    一些小程序
    ACM-ICPC 2018 徐州赛区网络预赛 H. Ryuji doesn't want to study
  • 原文地址:https://www.cnblogs.com/wang66a/p/12069284.html
Copyright © 2011-2022 走看看