java - 同步静态变量

标签 java multithreading

我理解的同步静态对象是一个变量,如果一个线程正在访问它,其他线程就不能。

    class T3
    {
    static Integer i = 0;
    
    static void callStatic()
    {
        synchronized(T3.class)
        {
            System.out.println(i++);
            while(true);
        }
    }
    
    public void notStatic()
    {
        System.out.println(i++);
        while(true);
    }
    }

    class T2 implements Runnable
{
    public void run()
    {
        System.out.println("calling nonstatic");
        new T3().notStatic();
    }
}

class T implements Runnable
{
    public void run()
    {
        System.out.println("calling static");
        T3.callStatic();
    }
}

public class Test
{
    public static void main(String[] args)
    {
        new Thread(new T()).start();
        try
        {
            Thread.sleep(100);
        }
        catch (InterruptedException e)
        {
        }
        new Thread(new T2()).start();
    }
}

但是这个演示程序的输出为:

calling static

0

calling nonstatic

1

我的理解有误吗?或者我错过了什么?

我尝试同步 callStatic 方法,并同步 T3.class 类对象。但没有一个像我想象的那样起作用。

注意:我认为,1 不会被打印,因为 callStatic 已锁定变量 i 并且处于无限循环中。

最佳答案

您不对变量进行同步,而是对对象进行同步。

callStatic1 上同步,然后将 i 设置为 2。如果 notStatic 此时进入 synchronized(i) block ,它将在 2 上同步。没有其他线程锁定 2,因此继续进行。

(实际上,12不是对象,而是Integer.valueOf(1)Integer.valueOf( 2) 返回对象,编译器会自动插入 Integer.valueOf 调用以将 int 转换为 Integer)

在您的代码中,notStatic 实际上根本不同步。确实,在特定时间只有一个线程可以处于特定对象的同步块(synchronized block)中,但这对不尝试进入同步块(synchronized block)的其他线程没有影响> 阻止。

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

相关文章:

java - 如何从多线程访问数组?

java - 关于servlet应用程序中连接池的一些问题

java - 在等待时既被通知又被中断的线程

java - 如何通过Java在Android中使用可绘制形状?

java.lang.UnixProcess 在 NTFS 上执行 `find` 本质上很慢?

vb.net - 使用 ManagementObjectSearcher 时检测到 DisconnectedContext

python - 在 python 中批处理线程

c - 使用环形缓冲区和 pthread 的生产者 - 消费者

java - 我似乎无法从一组中获取所有数据?

java - 无法运行 mvn clean