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,所以不会发生线程安全问题

    小蘑菇
  • 相关阅读:
    springboot事物和事物回滚
    MyBatis Sql语句中的转义字符
    使用 vagrant新建Linux虚拟机
    Centos 6.7 安装mongodb
    阿里云windows server 2012 TIME_WAIT CLOSE_WAIT
    使用Eclipse打jar包 包含依赖jar包
    linux crontab定时器
    mysql 存储过程学习笔记
    oracle windows 新建用户授权 导出导入bmp文件
    解决hash冲突的方法
  • 原文地址:https://www.cnblogs.com/wang66a/p/12069284.html
Copyright © 2011-2022 走看看