classMyThread{int num =1;publicvoidincrease(){if(num <=100){synchronized(this){notify();
System.out.println(Thread.currentThread().getName()+" "+ num++);try{wait();}catch(InterruptedException e){
e.printStackTrace();}}}}}publicclassSolution{publicstaticvoidmain(String[] args){
MyThread myThread =newMyThread();newThread(()->{for(int i =1; i <=100; i++)
myThread.increase();}).start();newThread(()->{for(int i =1; i <=100; i++)
myThread.increase();}).start();}}
ReentrantLock + Condition
import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.ReentrantLock;classMyThread{int num =1;
ReentrantLock lock =newReentrantLock();
Condition condition = lock.newCondition();publicvoidincrease(){if(num <=100){try{
lock.lock();
condition.signal();
System.out.println(Thread.currentThread().getName()+" "+ num++);try{
condition.await();}catch(InterruptedException e){
e.printStackTrace();}}finally{
lock.unlock();}}}}publicclassSolution{publicstaticvoidmain(String[] args){
MyThread myThread =newMyThread();newThread(()->{for(int i =1; i <=100; i++)
myThread.increase();}).start();newThread(()->{for(int i =1; i <=100; i++)
myThread.increase();}).start();}}