zoukankan      html  css  js  c++  java
  • Java 实例级别的锁和类级别的锁

    实例级别的锁

    实例代码

    @Slf4j
    public class AddCompareDemo {
        private int a, b;
    
        public void add() {
            for (int i = 0; i < 10000; i++) {
                a++;
                b++;
            }
        }
    
        public void compare() {
            for (int i = 0; i < 10000; i++) {
                if (a < b) {
                    log.info("a:{},b:{},{}", a, b, a > b);
                }
            }
        }
    
    }

    执行

    @SpringBootApplication
    public class NewdemoApplication {
    
        public static void main(String[] args) throws Exception {
            SpringApplication.run(NewdemoApplication.class, args);
            AddCompareDemo demo = new AddCompareDemo();
            new Thread(() -> {
                demo.add();
            }).start();
            new Thread(() -> {
                demo.compare();
            }).start();
        }
    
    }

    执行结果

     INFO 39336 --- [      Thread-30] com.example.newdemo.AddCompareDemo       : a:5262,b:5894,true

    解决

    这是同一个实例之间的行程安全问题。在方法上增加synchronize字段

    @Slf4j
    public class AddCompareDemo {
        private int a, b;
    
        public synchronized void add() {
            for (int i = 0; i < 10000; i++) {
                a++;
                b++;
            }
        }
    
        public synchronized void compare() {
            for (int i = 0; i < 10000; i++) {
                if (a < b) {
                    log.info("a:{},b:{},{}", a, b, a > b);
                }
            }
        }
    }

    即可解决问题

    类级别

    代码

    
    
    public class ClassLevelSyncDemo {

    private static int data;//类基本静态字段

    public synchronized void count() {//此处默认是实例级别的锁
    data++;
    }

    public static int getData() {
    return data;
    }
    }
     

    执行

    @SpringBootApplication
    @Slf4j
    public class NewdemoApplication {
    
        public static void main(String[] args) throws Exception {
            SpringApplication.run(NewdemoApplication.class, args);
            IntStream.rangeClosed(1, 100000).parallel().forEach(i ->
            {
                new ClassLevelSyncDemo().count();
            });
            log.info("" + ClassLevelSyncDemo.getData());
    
        }
    
    }

    执行结果

    28988 不是100000.

    解决方法

     1 public class ClassLevelSyncDemo {
     2 
     3     private static int data;//类基本静态字段
     4     private static Object object = new Object();
     5 
     6     public void count() {
     7         synchronized (object) {
     8             data++;
     9         }
    10     }
    11 
    12     public static int getData() {
    13         return data;
    14     }
    15 }
  • 相关阅读:
    Python语言简介以及特点
    计算机组成原理简述
    Python中的dict字典的用法
    Python3中IO文件操作的常见用法
    Python中的装饰器的使用及固定模式
    Python中的解决中文字符编码的问题
    Python中常见字符串去除空格的方法总结
    Python中print函数中中逗号和加号的区别
    当引用了Properties.Settings后,如果执行的时候,出现"配置系统无法初始化" 或者 某某节点不正确
    修改IP的方法(C#)
  • 原文地址:https://www.cnblogs.com/Brake/p/12709500.html
Copyright © 2011-2022 走看看