gpt4 book ai didi

java - 当我们在方法内创建锁(同步块(synchronized block))对象时会发生什么?

转载 作者:行者123 更新时间:2023-11-30 02:01:30 25 4
gpt4 key购买 nike

public class SampleExecutorService {
private static int count = 0;

private void increment() {
Object lock = new Object();
synchronized (lock) {
count++;
}
}

public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(10);
SampleExecutorService obj = new SampleExecutorService();
Runnable task = obj::increment;

for (int i = 0; i < 1000; i++) {
executorService.submit(task);

}
executorService.shutdown();

try {
executorService.awaitTermination(2, TimeUnit.MINUTES);
} catch (InterruptedException e) {
e.printStackTrace();
}

System.out.println("count : " + count);
}
}

上述程序的预期结果是 1000,但由于我遵循同步机制,所以它没有给出该结果。但是如果我们在类级别实例变量中创建一个锁对象,它就可以正常工作。正确的代码片段如下

public class SampleExecutorService {
private static int count = 0;
Object lock = new Object();
private void increment() {
//Object lock = new Object();
synchronized (lock) {
count++;
}
}

public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(10);
SampleExecutorService obj = new SampleExecutorService();
Runnable task = obj::increment;

for (int i = 0; i < 1000; i++) {
executorService.submit(task);

}
executorService.shutdown();

try {
executorService.awaitTermination(2, TimeUnit.MINUTES);
} catch (InterruptedException e) {
e.printStackTrace();
}

System.out.println("count : " + count);
}
}

我想知道,当我们在方法内创建锁对象时会发生什么?在方法内部创建锁对象与作为实例变量创建锁对象有什么区别?

最佳答案

局部变量存储在线程堆栈中,并为每个线程单独创建。如果局部变量不是基元,则实例本身存储在堆上,但对象的引用存储在线程堆栈上。这就是局部变量是线程安全的原因。

由于全局变量存储在堆上并且由多个线程共享/可见,因此它们需要同步。

因此,在第一个示例中,您为每个线程创建新锁,因此多个线程仍然可以访问它。

Here's关于 Java 内存模型的优秀文章

关于java - 当我们在方法内创建锁(同步块(synchronized block))对象时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52713700/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com