当前位置: 首页 > 知识库问答 >
问题:

多线程访问内部类

薛高澹
2023-03-14

我创建了3个线程,它们正在访问ThreadSaroundinnerClasss外部类的内部类MyInnerClass

package com.test;

public class ThreadsAroundInnerClasses {
    public static void main(String[] args) {
        Thread t1 = new Thread(new MyThread(), "THREAD-1");
        Thread t2 = new Thread(new MyThread(), "THREAD-2");
        Thread t3 = new Thread(new MyThread(), "THREAD-3");
        t1.start();
        t2.start();
        t3.start();
    }

    static class MyInnerClass {
        static int counter = 0;
        public void printIt(String threadName) {
            System.out.println("I am inside inner class, counter value is " + ++counter + " and thread name is " + threadName);
        }
    }
}

class MyThread implements Runnable {
    @Override
    public void run() {
        ThreadsAroundInnerClasses.MyInnerClass innerObj = new ThreadsAroundInnerClasses.MyInnerClass();
        innerObj.printIt(Thread.currentThread().getName());
    }
}

在输出中,我可以看到MyInnerClass类中的counter静态变量没有按顺序更新。

I am inside inner class, counter value is 1 and thread name is THREAD-1
I am inside inner class, counter value is 3 and thread name is THREAD-2
I am inside inner class, counter value is 2 and thread name is THREAD-3

如果有人能解释在多线程情况下如何处理内部类,将会有很大帮助?我们能同步整个内部类吗?

事先谢谢你的帮助。

共有2个答案

孟自强
2023-03-14

试试看:

    static class MyInnerClass {
    static int counter = 0;
    public void printIt(String threadName) {
        synchronized(MyInnerClass.class) {
            System.out.println("I am inside inner class, counter value is " + ++counter + " and thread name is " + threadName);
        }
    }
}

您的计数器是静态的,因此需要在整个类对象上进行同步。

孔才
2023-03-14

类是否是内部类是不相关的。您在这里看到的是预期的输出:您的程序中没有任何同步,因此线程调度程序可以在需要时自由切换到其他线程。下面是一个可能的操作序列,它将导致您看到的输出。

  1. T1:增量计数器
  2. T1:共轭酸
  3. T1:打印
  4. T3:增量计数器
  5. T3:串联
  6. T2:增量计数器
  7. T2:串联
  8. T2:打印
  9. T3:打印

如果您希望计数器增量、级联和打印是原子操作,那么您应该确保它在唯一锁上同步:

synchronized MyInnerClass.class {
    System.out.println("I am inside inner class, counter value is " + ++counter + " and thread name is " + threadName);
}
 类似资料:
  • 本文向大家介绍PHP多线程之内部多线程实例分析,包括了PHP多线程之内部多线程实例分析的使用技巧和注意事项,需要的朋友参考一下 本文实例分析了PHP多线程之内部多线程用法。分享给大家供大家参考。具体如下: 希望本文所述对大家的php程序设计有所帮助。

  • 我有一个应用程序,它有一个ConcurrentHashMap本地存储一个存储在外部服务器上的数据副本。地图每隔几秒钟就会更新一次数据的新副本。 我有一个循环,每隔几秒钟运行一次,它可以访问HashMap并按照值的顺序将元素添加到数组中(实际上它做的事情还多一些,但这并不相关)。我的问题是,如果数据在创建数组的过程中发生了变化,您可能会在不同的地方有重复的键,或者完全省略一些键。 示例: 如您所见,

  • 如何从多个线程同时访问静态变量。 如果我有这样的课 我需要访问线程1的值,比如 从线程2中,我需要设置如下值 这会导致内存冲突吗?。如果是,建议使用什么方法来处理这种情况?。

  • 问题内容: 我正在努力加快某些过程的执行速度,这些过程将大量记录(大多数是几百万个)发布到Elasticsearch。在我的C#代码中,我已经使用Dataflow实现了一个多线程解决方案,如下所示: 然后我要实现的发送批量请求调用: 我的问题 ,你 是对的实用性存在的数据流管道的一部分的锁内执行额外的线程。 这个可以吗?我可以在性能,执行,缓存/内存丢失等方面看到任何潜在的问题吗? 任何见识都会很

  • 我有两个不同的微服务,将尤里卡作为服务注册表,现在我正在尝试从另一个微服务调用微服务,解析带有功能区的endpoint以进行客户端负载平衡。 服务A: 此服务公开一个终结点,并且应用程序.yml 如下所示: 调用服务A的服务B具有以下应用程序类: 控制器 服务 但我在尝试访问服务时遇到了一个异常: 对此有什么建议吗?

  • 问题内容: 我正在尝试使用docker-compose启动kafka服务,并且应该可以在docker内部和外部进行访问。因此,应该在内部和外部设置合适的广告客户: 问题是,当我尝试从群集外部进行连接时,节点名称不是127.0.0.1,而是内部主机名: 这不是KAFKA_ADVERTISED_LISTENERS和KAFKA_LISTENERS处理这种情况的目的吗?我尝试设置KAFKA_ADVERTI