Работа нескольких потоков с объектом в котором есть как синхронизированные методы, так и не синхронизированные

у мея есть простой класс с несколькими методами, некторые из них помечены synchronized, например:

    public class NowItNotThreadSafeClass {
    
        public SharedObject sharedResource;
    
        public  NowItNotThreadSafeClass(ShareObject shareResource) {
            this.sharedResource = sharedResource;
        }
      
        public synchronized void methodOne() {
            sharedResource.someStateChangingMethod();
        }
    
        public synchronized void methodOne() {
            shareResource.anotherStateChangingMethod();
        }
    
        public void notSynchronizedMethod() {}
            shareResource.andOneElseMethodChangingState();
    }

Я раотаю с переменной класса shareResource в синхронизированных методах, понимаю для чего это нужно при работе с объектом класса NowItNotThreadSafeClass несколькими потоками, понимаю, что в данном случае синхронизация происходит на объекте this, но не до конца понимаю сможет ли другой объект вызвать метод notSynchronizedMethod() при уже занятом мониторе экземпляра NowItNotThreadSafeClass (то есть если какой-то поток уже вошел в синхронизированный метод) и что будет если какой-то поток войдет в несинхронизированный метод notSynchronizedMethod первый, а другой в этот момент начнет входить в синхронизированный


Ответы (1 шт):

Автор решения: Nowhere Man

Следует отметить, что код не скомпилируется, так как в классе NowItNotThreadSafeClass определены два метода с одинаковым именем methodOne, поэтому предположим, что эта ошибка исправлена.

сможет ли другой объект вызвать метод notSynchronizedMethod() при уже занятом мониторе экземпляра NowItNotThreadSafeClass

Да, другой поток сможет спокойно вызвать несинхронизированный метод notSynchronizedMethod для одного и того же экземпляра класса NowItNotThreadSafeClass

что будет если какой-то поток войдет в несинхронизированный метод notSynchronizedMethod первый, а другой в этот момент начнет входить в синхронизированный

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


Соответственно, если один и тот же экземпляр класса SharedObject будет использоваться совместно несколькими экземплярами класса NowItNotThreadSafeClass, для каждого из которых будут вызываться в разных потоках только синхронизированные методы methodOne / methodTwo, состояние в таком экземпляре SharedObject будет меняться неопределенным образом.

→ Ссылка