java - 如何锁定线程的函数访问

标签 java multithreading

您好,我有如下代码。

class main{
    main()
    {
        myThread1 mt1 = new myThread1();
        myThread2 mt2 = new myThread2();

        mt1.start();
        mt2.start();

        mt1.join();
        mt2.join()

        System.out.println(access.sb.toString());
    }
}

class myThread1{
    run(){
        access.grow(" IJKLMNOP ");
    }
}

class myThread2{
    run(){
        access.grow(" ABCDEFGH ");
    }
}

class access{
StringBuilder sb = new StringBuilder();
    void grow(str)
    {
        sb.append(str);
    }

}

**忽略错误

输出:

 ABCDE IJKLMFGHFGH

Expected Output 应该是一个接一个,反之亦然。我想通了,这是由于两个线程随机访问函数 grow。是否有任何流程可以让我在一个实例中只允许访问函数 grow 一个线程。

最佳答案

grow 标记为 synchronized将导致 access 的特定实例在线程之间序列化对 grow 的调用:

synchronized void grow() {
    ...
}

另一种方法是将工作排入某种线程安全的 Queue 类型(通常是某种 BlockingQueue),然后从队列中读取工作不同的线程,但鉴于您提供的上下文,这可能不是必需的。

关于java - 如何锁定线程的函数访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22289695/

相关文章:

java.lang.OutOfMemory错误: Java heap space - Stack Trace Meaning

c++ - 在一个线程中完成的操作对另一个线程可见,而无需显式同步

c++ - Linux Socket 文件描述符与线程

java - 使用 Thread.sleep 线程 hibernate 时的 CPU 消耗

java - 使用多个模式时,如何在 match.find() 之后查找当前用于模式匹配的正则表达式?

java - 为什么不允许 ReadWriteLock 升级?

java - 如何使用 setArguments/getArguments 创建 fragment

python time.sleep 花费的时间比预期的要长(多线程)

windows - 具有常见 OnTerminate 行为的 TThread

java - 忽略大写/小写字符串