Прежде всего, я думаю, теперь я понимаю ваш вопрос. Вы пытаетесь распечатать свои строки, не вмешиваясь в строки других потоков.
Чтобы достичь этого, вам нужно «защитить» ту часть кода, которая печатает одну строку, чтобы не получить одновременно распечатывает другую строку из другого потока.
Защита может быть выполнена путем синхронизации этих строк кода.
В настоящее время вы синхронизируете только добавление к этому счетчику.
Ваша блокировка (объект, на который вы блокируете, единственный экземпляр этого нового объекта ()) - stati c, и вы не изменяете его в своем коде, поэтому он должен работать.
public static Object lock1 = new Object();
Вы можете сделать переменную final, чтобы получить неизменяемость, но в настоящее время это не проблема. Тем не менее, я бы порекомендовал.
Блокировка означает, что, если какой-либо другой поток выполняет (выполняет) ту же строку кода (начало синхронизированного блока), они не получат выполнение до блокировки нить отказывается от блокировки. Это верно только в том случае, если они держатся и просят тот самый замок. И так как вы используете только тот же новый экземпляр Object (), ваша блокировка должна быть в порядке.
В настоящее время ваш код создан так, что метод add () в основном ожидает, пока один из потоков не начнет отсчет один.
Если вы хотите изменить его, чтобы получать отдельно распечатанные строки, попробуйте синхронизировать «блок строчной печати» следующим образом:
synchronized (lock1) {
System.out.println(color + Thread.currentThread().getName() + "is Running");
add();
}
И пусть счет не будет синхронизировано.
private static void add(){
count1++;
}
Это будет работать, но в большинстве случаев вы не хотите оставлять метод add () несинхронизированным. Это может быть выполнено из других потоков, кто знает. Но для вашего случая эти изменения помогут.