マルチスレッドでデータ同期を行う理由


package com.mhm.test;

public class Test7 extends Thread {
	public static int n = 0;

	public void run() {
		int m = n;
		yield();
		m++;
		n = m;
	}

	public static void main(String[] args) throws Exception {
		Test7 myThread = new Test7();
		Thread threads[] = new Thread[100];
		for (int i = 0; i < threads.length; i++)
			threads[i] = new Thread(myThread);
		for (int i = 0; i < threads.length; i++)
			threads[i].start();
		for (int i = 0; i < threads.length; i++)
			threads[i].join();
		System.out.println("n = " + Test7.n);
	}
}

このコードの実行が完了すると、結果は100ではない可能性があります.汚れたデータが発生したためです.
解決策はrun()の前にsynchronizedを加えることです
転載先http://java.chinaitlab.com/line/779590.html
 
23種類の設計モードにおけるシングルトン(Singleton)モードは、従来の方法で設計されている場合もスレッドが安全ではなく、次のコードはスレッドが安全ではないシングルトモードである.
 
class Singleton
{
    private static Singleton sample;

    private Singleton()
    {
    }
    public static Singleton getInstance()
    {
        if (sample == null)
        {
            Thread.yield(); //  Singleton 
            sample = new Singleton();
        }
        return sample;
    }
}
public class MyThread extends Thread
{
    public void run()
    {
        Singleton singleton = Singleton.getInstance();
        System.out.println(singleton.hashCode());
    }
    public static void main(String[] args)
    {
        Thread threads[] = new Thread[5];
        for (int i = 0; i < threads.length; i++)
            threads[i] = new MyThread();
        for (int i = 0; i < threads.length; i++)
            threads[i].start();
    }
}

 , getInstance() 
synchronized