我想知道,2个不同的线程可以同时调用最终的静态方法吗? 静态最终方法是否同步? 提前致谢。 BR 拉夫
答案 0 :(得分:1)
许多线程可以同时调用最终的静态方法(实际上任何静态方法同时调用final
表示该方法可能不会被覆盖)。不,它本身并不是同步的,但确实有局部变量。如果要查看哪些线程在哪里
static final void printThreadId() {
Thread ct = Thread.currentThread();
System.out.printf("%d %s%n", ct.getId(), ct.getName());
}
public static void main(String[] args) {
printThreadId();
Runnable r = new Runnable() {
@Override
public void run() {
printThreadId();
Thread.yield();
printThreadId();
}
};
Thread[] arr = { new Thread(r), new Thread(r) };
for (Thread th : arr) {
th.start();
}
Thread.yield();
printThreadId();
for (Thread th : arr) {
try {
th.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
示例输出
1 main
1 main
10 Thread-1
9 Thread-0
10 Thread-1
9 Thread-0
答案 1 :(得分:1)
2个不同的线程可以同时调用最终的静态方法吗?
是
静态最终方法是否会同步?
没有。只有synchronized
方法会同步,或者在内部使用synchronized
。
答案 2 :(得分:0)
2个不同的线程可以同时调用最终的静态方法吗?
是的,2个不同的线程可以同时调用最终的静态方法。
静态最终方法是否会同步?
您可以显式同步该方法,但这将是类级别同步而不是对象级别。你需要使用 Synchronized 关键字。
答案 3 :(得分:0)
当然可以。写信到任何static
字段时要小心。请记住,int
在Java中是原子,但double
或long
不一定是原子的。
您没有在静态方法上获得功能级别同步,因为没有要同步的对象。但是你可以在该函数中同步一个对象(甚至是一个静态字段)。