Java 实例级别的锁和类级别的锁

2020-04-15 16:07:43来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

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 }

 


原文链接:https://www.cnblogs.com/Brake/p/12709500.html
如有疑问请与原作者联系

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:面试时你被提过哪些问题下面copy些我觉得经典全面的java面试问题

下一篇:LeetCode 面试题 16.03. 交点