マルチスレッドでデータ同期を行う理由
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