混淆多个线程同时访问的静态final方法

时间:2014-11-19 09:01:23

标签: java multithreading

我想知道,2个不同的线程可以同时调用最终的静态方法吗? 静态最终方法是否同步? 提前致谢。 BR 拉夫

4 个答案:

答案 0 :(得分:1)

许多线程可以同时调用最终的静态方法(实际上任何静态方法同时调用final表示该方法可能不会被覆盖)。不,它本身并不是同步的,但确实有局部变量。如果要查看哪些线程在哪里

,您始终可以打印当前线程ID
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)

  1. 当然可以。写信到任何static字段时要小心。请记住,int 在Java中是原子,但doublelong不一定是原子的。

  2. 您没有在静态方法上获得功能级别同步,因为没有要同步的对象。但是你可以在该函数中同步一个对象(甚至是一个静态字段)。