您好我的代码如下。
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
预期输出应该是一个接一个,或副。我想通了,这是因为两个线程都随机访问了函数grow
。是否有任何进程,以便我只允许在一个实例上访问函数grow
。
答案 0 :(得分:4)
将grow
标记为synchronized
会导致access
的特定实例在线程中序列化对grow
的调用:
synchronized void grow() {
...
}
另一种方法是将工作排入某种线程安全的Queue
(通常是某种BlockingQueue
),然后在另一个线程上从队列中读取工作,但这可能是根据你提供的背景,没有必要。
答案 1 :(得分:0)
为了获得更好的性能,请使用同步块
void grow(str)
{
synchronize(sb){
sb.append(str);
}
}
你也可以使用并发pkg锁类
Lock lock = new ReentrantLock();
void grow(str)
{
try{ lock.lock();
sb.append(str);
finally(){
lock.unlock();
}
}