同じインスタンス変数のマルチスレッド操作を実装するJavaプログラムを作成すると、マルチスレッド同時実行のセキュリティ問題が発生します。

この章を見る

ジョブディレクトリを表示する


ニーズの声明:

同じインスタンス変数操作のマルチスレッド操作は、マルチスレッド同時実行のセキュリティ問題を引き起こします。現在、3匹のサルを表す3つのスレッドがあり、クラス内で整数変数カウントを操作しています(花の総数、合計20の花を表します)。この変数は花の総数を表します。異なるサル(糸)が摘み取られるたびに、すべての花が異なるサルによって摘み取られてプログラムが終了するまで、花の総数は1つ減ります。

実現のアイデア:

  1. プロジェクトにCurrentクラスを作成します。Currentクラスで、静的Currentタイプを宣言して、currentタイプとintタイプのインスタンス変数numを参照し、numの初期値を20に指定します。これは、花の総数を表します。
  2. fetch()メソッドを定義します。メソッドで同期コードブロックを使用して、現在のオブジェクトをロックします。同期コードブロックで、numが0より大きいかどうかを判断し、0より大きい場合は、サルが花を摘む進行状況を出力し、numをデクリメントさせます。
  3. run()メソッドをオーバーライドします。このメソッドでwhileループを作成します。条件は、numが0より大きいことです。fetch(String name)メソッドがループで呼び出され、現在実行中のスレッド名がThread.currentThread()。getName()メソッドを呼び出すことによって取得され、スレッド名がパラメーター名に割り当てられます。
  4. プログラムエントリのmain()メソッドを作成し、このメソッドで3つのスレッドを作成し、これら3つのスレッドの名前を「monkeyA」、「monkey B」、「monkey C」に設定してから、start( )メソッド、開始スレッド

実装コード:


public class T1 implements Runnable {
//	public static T1 t2 = new T1();
	//设置鲜花的数量为20 
	int num = 20;

	@Override
	public void run() {
		synchronized (new T1()) {
			while (num>0) {
				System.out.println("猴子"+Thread.currentThread().getName()+"\t菜花\t"+num--);
				try {
					Thread.sleep(500);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}
	public static void main(String[] args) {
		T1 t1=new T1(); 
		Thread thread = new Thread(t1);
		Thread thread1 = new Thread(t1);
		thread1.setName("B");
		thread.setName("A");
		thread.start();
		thread1.start();
	}
}

 

おすすめ

転載: blog.csdn.net/weixin_44893902/article/details/108815665