Синтаксис Java: «синхронизирован (это)»

Можете ли вы объяснить мне этот кусок кода Java? Я не могу понять этот синтаксис.

synchronized (this) {
              try {
                  wait(endTime - System.currentTimeMillis());
              } catch (Exception e) {
              }
}

Ответы на вопрос(6)

synchronized (this) {
 }

и он может выбирать, на каком объекте он синхронизируется. Синхронизированный метод может использовать толькоэтот' (или соответствующий экземпляр класса для синхронизированного метода класса)

Посмотрите эти ссылки, может быть, это даст вам лучший ответ.

Java синхронизированные блокисинхронизированный блок против синхронизированного метода?

связанную с объектом, на который указывает "этот", Когда мы используем этот блок, мы имеем в виду, что мы готовы подождать, пока поток, использующий этот монитор, не освободит его. Это имеет смысл использовать блокировку, если вы измените объект данных (объект 'переменные).

wait - заставляет текущий выполняющийся поток ждать, пока другой поток не вызовет метод notify или в течение указанной продолжительности.

кода. Только один поток одновременно может выполнять блок кода одновременно. Прочтите Раздел 2.2этот урок для дополнительной информации

synchronized (this) {

Приведенный ниже блок кода, по-видимому, использует (очень плохой) метод приостановки выполнения потока на определенный период времени.

    try {
        wait(endTime - System.currentTimeMillis());
    } catch (Exception e) {
    }

Кроме того, этоглотание» любые исключения, которые могут быть выброшены во время ожидания, что действительно очень непослушно.

synchronized (this)

синхронизация на уровне блоков.

Это означает, что наthis только объект, и только один поток может извинить закрытый блок за один раз.

Смотрите здесь для более подробного ответа:Синхронизация на уровне блоков

ное (это)» вовремя. Но это не всегда так! Рассмотрим код ниже. В моем коде я синхронизировал статический объект как блокировку, и все работает нормально. Когда я изменяю код для синхронизации с (этим), несколько потоков обращаются к коду одновременно, и это все портит. Будьте осторожны при синхронизации (это). Примечание. Код создает рекурсивные потоки, а затем отображает их в обратном порядке.

Главный
public class Project2 
{
    public static void main(String[] args) throws InterruptedException 
    {
        Object lock = new Object();
        Threads2 t1 = new Threads2(1);
        t1.setName("Thread 1");
        t1.start();
        Threads2.que.add(t1);
        t1.join();
    } 
}
Threads2
public class Threads2 extends Thread
{
    //private final ArrayBlockingQueue<threads> que = new ArrayBlockingQueue<>(5);
    public static ArrayList<thread> que = new ArrayList<>(5);
    private volatile int i;
    private static volatile boolean locked = true;
    private static final Object lock = new Object();

    public Threads2(int i) 
    {        
        this.i = i;
    }
    @Override
    public void run()
    {   
        try
        {
            System.out.println("Thread " + i + ": created");       
            synchronized(lock)
            {
                i++;
            }       
            if(i <= 50)
            {
                Threads2 t = new Threads2(i);
                t.setName("Thread " + i);
                t.start();  
                que.add(Thread.currentThread());
            }
            else
            {
                Thread.currentThread().interrupt();
            }
            while(locked)
            {
                Thread.sleep(10000);
            }
        }
        catch(InterruptedException ex)
        {   
            synchronized(lock)
            {
                if(i >= 0)
                {
                    que.get(i-2).interrupt();
                    i--;
                    System.out.println(Thread.currentThread().getName());
                }    
            }       
        }       
    }    
}
</thread></threads>
 Nathan Hughes09 февр. 2019 г., 15:03
Синхронизация на этом перерывы здесь, потому что естьнет общей блокировки.
Решение Вопроса

synchronized это означает, что не более одного потока сможет получить доступ к коду внутри этого блока.

Такжеthis означает, что вы можете синхронизировать текущий экземпляр (получить блокировку текущего экземпляра).

Это то, что я нашел в Кэти Сьерраs Java сертификационная книга.

Поскольку синхронизация вредит параллелизму, вы неЯ не хочу синхронизировать больше кода, чем необходимо для защиты ваших данных. Поэтому, если область действия метода больше, чем нужно, вы можете уменьшить область действия синхронизированной части до уровня, меньшего, чем у полного метода.просто блок.

Посмотрите на следующий фрагмент кода:

public synchronized void doStuff() {
    System.out.println("synchronized");
}

который можно изменить на это:

public void doStuff() {
   //do some stuff for which you do not require synchronization
   synchronized(this) {
     System.out.println("synchronized");
     // perform stuff for which you require synchronization
   }
}

Во втором фрагменте блокировка синхронизации применяется только к этому блоку кода, а не ко всему методу.

Ваш ответ на вопрос