线程同步 - 几乎相同的表达式但不同的结果

Thread synchronizing - almost same expressions but different result

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>>:同步(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>>:同步无效 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> 未同步,打印非同步结果。
为什么会这样?
sleep(1); 目的 是什么? 提前致谢。

这似乎是示例代码,用于演示当对所有线程 (m) 共有的对象进行同步时,一次只有一个线程可以使用它,而不是在线程中同步一个方法时,它什么都不做,因为每个线程都有自己的锁。

关于你的第二个问题,sleep(1)的意思是当前线程应该等待至少 1毫秒才能继续。

最后,根据我的经验,当您有多个线程在同一资源之后(尤其是 System.out 之类的 (Print)stream)时,解决此问题的最佳方法是使用消息队列同步发出的消息。