public class MythreadM {
public static void main(String[] args) {
// TODO Auto-generated method stub
Msg m = new Msg();
Mythread thread1 = new Mythread(m);
thread1.start();
Mythread thread2 = new Mythread(m);
thread2.start();
Mythread thread3 = new Mythread(m);
thread3.start();
}
}
class Mythread extends Thread
{
private Msg m;
Mythread(Msg m)
{
this.m = m;
}
public void run()
{
System.out.println(getName()+"start");
for(int i=0; i<300; i++)
{
processMsg(i);
}
}
synchronized void processMsg(int i) // here starts question.
{
// synchronized(m)
{
m.write(getName()+" message "+i);
try {
sleep(1);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
m.print();
}
}
}
class Msg
{
String str = "def message";
void print()
{
System.out.println(str+" "+System.currentTimeMillis());
}
void write(String str)
{
this.str = str;
}
}
上面的完整代码-----------------
并遵循具有几乎相同表达式的 3 个代码。
<< 代码 1 >> : synchronized(m) {}
void processMsg(int i)
{
synchronized(m)
{
m.write(getName()+" message "+i);
try {
sleep(1);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
m.print();
}
}
<< 代码 2 >> : synchronized void processMsg(int i)
synchronized void processMsg(int i)
{
{
m.write(getName()+" message "+i);
try {
sleep(1);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
m.print();
}
}
看起来这些代码的含义相同,只是表达方式不同,但行为不同。
< 代码 2 > 不是 synchronized,打印非 synchronized 结果。
为什么会发生这种情况?
sleep(1);
的目的是什么?提前致谢。
回答1
看起来这是示例代码,用于演示当对所有线程 (m) 共有的对象进行同步时,一次只有一个线程可以使用它,而不是在线程中同步方法时,这不起作用任何事情,因为每个线程都获得了自己的锁。
对于您的第二个问题, sleep(1) 的含义是当前线程应该在继续之前等待至少 1 毫秒。
最后,根据我的经验,当您有多个线程在同一资源之后(尤其是像 System.out 这样的(打印)流),解决此问题的最佳方法是使用消息队列来同步发出的消息。