JAvaキーワードsynchronized練習

1864 ワード

1.キーワードを付けない前


次のプログラムコードの場合、aは自己加算後、aの値を印刷し、動作全体が他のスレッドによって中断されないことを望んでいます.
package io.github.ywbrj042.threads;

/**
 * synchronized 。
 * 
 * @author Administrator
 * 
 */
public class SynchronizedThreadTest {

	protected static int a = 0;

	public static class SynchronizedThread extends Thread {

		@Override
		public void run() {
			a++;
			try {
				Thread.sleep(50);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			System.out.println(a);
		}
	}

	public static void main(String[] args) {
		SynchronizedThread thread1 = new SynchronizedThread();
		SynchronizedThread thread2 = new SynchronizedThread();
		thread1.start();
		thread2.start();
	}
}

このコードの実行結果は次のとおりです.
2 2
結果を見ると,これは明らかに我々が望んでいる結果ではなく,2つのスレッドが共有変数aの修正に対して互いに結果を干渉している.現在のaの値がthread 1に対して0であると仮定すると、印刷結果は1である.
thread 2に対して現在のaの値が1であると仮定すると、印刷結果は2である.したがって,スレッドの不安全がもたらす結果は,我々のプログラム実行の予想が困難であり,プログラム実行の結果がべき乗であるべきであるなどの原則と衝突していることを示している.

2.キーワードを追加した後

package io.github.ywbrj042.threads;

/**
 * synchronized 。
 * @author Administrator
 *
 */
public class SynchronizedThreadTest {
	
	protected static int a = 0;
	
	protected static Object lockObject = new Object();
	
	public static class SynchronizedThread extends Thread{

		@Override
		public void run() {
			synchronized (lockObject) {
				a++;
				try {
					Thread.sleep(50);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				System.out.println(a);
			}
		}
	}

	public static void main(String[] args) {
		SynchronizedThread thread1 = new SynchronizedThread();
		SynchronizedThread thread2 = new SynchronizedThread();
		thread1.start();
		thread2.start();
	}
}

実行結果は毎回
1 2
これは我々の予想結果と一致し,スレッドセキュリティに達した.