您好,我有如下代码。
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/