java
1public class PrintThread extends Thread { 2 3 private String message; 4 private Object lock = new Object(); 5 6 public PrintThread(String message){ 7 this.message = message; 8 } 9 10 public void run() { 11 for (int i=0 ; i<1000 ; i++){ 12 synchronized(lock) { 13 System.out.print(message); 14 } 15 } 16 } 17 18 public static void main(String[] args) { 19 PrintThread p1 = new PrintThread("*"); 20 p1.start(); 21 PrintThread p2 = new PrintThread("+"); 22 p2.start(); 23 } 24}
実行結果例↓(実行するたびに変わる)
txt
1*********************************************+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++************************++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++***********************************+*+*************************************************************************************************************************+***++++++++++++++*++++++++++++++**********************************************************************************************************************************+*+***************************************************************++++++++++++++++++++++++++++++++++++++++++++++++++*++*********************************************************************************************************************************************************************************************************************************************++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++***************************************++++++++++++++++++++++++++++++++++++++++++++++++***********************************+++++++**++**************++**++****+++******+++*****++++++**+++**++******++*****++**+++++***++++**++***++++++++++++++*********++***********+++**+++++++++**++******++*+++++++++++++***++++********++++++++****++**++**++++++**++************++**++****++**++++****++**++**++**++**++++++++++++++***++****++++++++**+++++********++++********+++++++++++++++***++++++**++**++*****++**++**++****+++++++++++++++++++++++++****+++++++++***++++*****+++++++++++++++******++******************++**++***************************************++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
上記のコードは、「*」と「+」を交互に表示するプログラムをしようと書いたコードです。しかし、synchronized文を上手く使うことができずに困っています。
このコードをどのように変えればよいか教えてください。理由も知りたいです。。
考察
おそらく現在のコードでは、フィールドのmessageが変わるスピードと画面表示のスピードが違うため思った通りの画面表示ができていないのだと考えています。
したがって、コンストラクタの「this.message = message」もsynchronized文の中に入れるようなコードが正しいと考えています。