use*_*375 0 java multithreading synchronization scjp
我正在攻读java认证,我从Mughal的书中看到了这个例子:
public class Smiley extends Thread
{
@Override
public void run()
{
while(true)
{
synchronized(this)
{
try
{
System.out.print(":");
Thread.sleep(100);
System.out.print("-");
Thread.sleep(100);
System.out.println(")");
Thread.sleep(100);
}
catch(InterruptedException e)
{
e.printStackTrace();
}
}
}
}
public static void main(String[] args)
{
new Smiley().start();
new Smiley().start();
}
}
Run Code Online (Sandbox Code Playgroud)
目的是每行打印一个笑脸:-).我的问题是,为什么同步实例(这个)不能实现这一点?为什么我们需要在静态级别上同步?
谢谢,
因为请注意main()函数创建两个 Smiley类.他们每个人都在自己的线程上运行.由于它们是锁定的this,它们都将立即获得锁定,而不会与另一个线程争用.在这种情况下,他们的锁定方案synchronize(this)完成任何事情.
在处理多线程问题时,您必须考虑"我想保护什么?" 在这种情况下,您需要保护System.out,以确保您按照您想要的顺序访问它.由于System.out是静态的,因此您需要某种外部作用域锁定,每个线程在写入之前必须获取这些锁定 .
您可以使用ReentrantLock来实现此目的.
| 归档时间: |
|
| 查看次数: |
988 次 |
| 最近记录: |