Synchronzied 修饰非静态方法==》对象锁
Synchronzied 修饰静态方法==》其实是类锁,因为是静态方法,它把整个类锁起来了;
什么时候选择在非静态方法上Synchronzied ?
首先我们要知道,加载非静态方法上是对象锁,一个class类模板可以复制出无数的类,也就是说在非静态方法上加Synchronzied ,只能达到当前的这个类中的各种操作是线程安全的。多个线程同时操作一个对象为前提。
以下列代码为例:
@Slf4j
public class TesThread {
volatile int a = 1;
volatile int b = 1;
public synchronized void add() {
log.info("add start");
for (int i = 0; i < 10000; i++) {
a++;
b++;
}
log.info("add done");
}
public synchronized void compare() {
log.info("compare start");
for (int i = 0; i < 10000; i++) {
//a始终等于b吗?
if (a < b) {
log.info("a:{},b:{},{}", a, b, a > b);
//最后的a>b应该始终是false吗?
}
}
log.info("compare done");
}
public static void main(String[] args) {
TesThread interesting = new TesThread();
new Thread(() -> interesting.add()).start();
new Thread(() -> interesting.compare()).start();
}
}
在当前对象的操作下,无疑是线程安全的,这个前提条件在某种程度下对应了单例模式
版权声明:本文为jj89929665原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。