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

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 这样的(打印)流),解决此问题的最佳方法是使用消息队列来同步发出的消息。

相似文章

最新文章