package ru.job4j.wait_notify_notifyall;

import java.util.concurrent.TimeUnit;

/**
 * MyLock.
 *
 * @author Alexander Ivanov
 * @version 1.0
 * @since 31.07.2017
 */
public class MyLock {
    /**
     * Boolean for checking lock.
     */
    private boolean isLock = false;

    /**
     * Lock monitor.
     */
    public void lock() {
        try {
            synchronized (this) {
                while (isLock) {
                    wait();
                }
                isLock = true;
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    /**
     * Unlock monitor.
     */
    public void unlock() {
        synchronized (this) {
            if (isLock) {
                isLock = false;
                notifyAll();
            } else {
                throw new IllegalMonitorStateException();
            }
        }
    }

    /**
     * Main for showing locking and unlocking.
     * @param args from cmdLine.
     */
    public static void main(String[] args) {
        MyLock lock = new MyLock();

        new Thread(() -> {
            try {
                System.out.println("Втростепенный поток ждет пока главный захватит блокировку");
                TimeUnit.MILLISECONDS.sleep(20);
                System.out.println("Второстепенный поток пытается захватить блокировку");
                lock.lock();
                System.out.println("Второстепенный поток захватил блокировку");
                System.out.println("Второстепенный поток делаает работу........");
                lock.unlock();
                System.out.println("Второстепенный поток отпускает блокировку и заканчивает свою работу");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();

        lock.lock();
        System.out.println("Основной поток захватил блокировку");
        try {
            System.out.println("Основной поток засыпает ненадолго");
            TimeUnit.MILLISECONDS.sleep(200);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        lock.unlock();
        System.out.println("Основной поток отпускает блокировку и заканчивает свою работу");
    }
}

@@ -313,24 +313,37 @@
 %0A    public 
+synchronized 
 void lock() 
@@ -362,46 +362,8 @@
 y %7B%0A
-            synchronized (this) %7B%0A    
     
@@ -407,20 +407,16 @@
     
-    
 wait();%0A
     
@@ -407,28 +407,24 @@
     wait();%0A
-    
             
@@ -429,36 +429,32 @@
   %7D%0A            
-    
 isLock = true;%0A 
@@ -452,30 +452,16 @@
 = true;%0A
-            %7D%0A
         
@@ -599,32 +599,8 @@
 lic 
-void unlock() %7B%0A        
 sync
@@ -612,13 +612,20 @@
 zed 
-(this
+void unlock(
 ) %7B%0A
@@ -632,20 +632,16 @@
         
-  
-  
 if (isLo
@@ -638,36 +638,32 @@
   if (isLock) %7B%0A
-    
             isLo
@@ -674,20 +674,16 @@
  false;%0A
-    
         
@@ -707,20 +707,16 @@
         
-    
 %7D else %7B
@@ -716,20 +716,16 @@
  else %7B%0A
-    
         
@@ -766,38 +766,24 @@
 xception();%0A
-            %7D%0A
         %7D%0A  
@@ -842,16 +842,23 @@
 ocking.%0A
+     *%0A
      * @

Add myLock.