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 }
  • 相关阅读:
    django 从零开始 9 自定义密码验证加密
    OJ建站之Virtual Judge系统搭建
    OJ建站之HUSTOJ搭建
    Android Studio:Gradle DSL method not found: 'runProguard()'
    品牌笔记本预装windows的OEM分区解决方案(联想)
    Win8/8.1 下映像管理和恢复环境的配置
    POJ 2728 Desert King 最优比率生成树
    POJ 2976 Dropping tests 01分数规划 模板
    HDU 4081 Qin Shi Huang's National Road System 次小生成树变种
    HDU 4408 Minimum Spanning Tree 最小生成树计数
  • 原文地址:https://www.cnblogs.com/Brake/p/12709500.html
Copyright © 2011-2022 走看看