java - java静态同步方法

标签 java multithreading

以下代码给出的固定输出为 400000000,而当我从同步的 addOne 方法中删除静态关键字时,我得到的随机输出小于 400000000 的任何整数。
谁能解释一下吗?

public class ThreadTest extends Thread{

public static int sharedVar = 0;

private static synchronized void addOne()
{
    for (int i = 0; i < 200000000; i++)
    {
        sharedVar++;
    }
}

@Override
public void run()
{
    addOne();
}

public static void main(String[] args)
{
    ThreadTest mt1 = new ThreadTest();
    ThreadTest mt2 = new ThreadTest();
    try
    {
        // wait for the threads
        mt1.start();
        mt2.start();    
        mt1.join();
        mt2.join();
        System.out.println(sharedVar);
    }
    catch (InterruptedException e1)
    {
        e1.printStackTrace();
    }
}
}

最佳答案

稍微更改您的 addOne() 方法,如下所示以了解其行为。

private static synchronized void addOne() {
    for (int i = 0; i < 5; i++) {
        sharedVar++;
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
        }
        System.out.println(Thread.currentThread().getName());
    }
}

使用static输出是:

Thread-0
Thread-0
Thread-0
Thread-0
Thread-0
Thread-1
Thread-1
Thread-1
Thread-1
Thread-1

如果没有static,输出是:

Thread-0
Thread-1
Thread-0
Thread-1
Thread-0
Thread-1
Thread-1
Thread-0
Thread-0
Thread-1

如果您需要更多信息来理解它,请参阅oracle thread synchronization tutorial .

关于java - java静态同步方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37819462/

相关文章:

java - boolean 标志上的 Spring 重试策略

java - GridBagLayout 无法正确布局

python - 现实生活过程的异步、多线程模拟

c# - Go 例程与任务并行库的实现

java - 如何确认同一任务是否在多个服务器实例上完成

java - 如何使用 Jackson 将 json 列表反序列化为 java 对象

java - StreamTokenizer,渲染html文件?

c++ - 如何在C++中使用原子防止关键部分访问

c - 来自 atoi 的段错误

java - 从写入器向读取器发送信号时正确使用 ReentrantReadWriteLock?