synchronized
public class Main {
private static volatile int state;
public static void main ( String[ ] args) {
Object o= new Object ( ) ;
new Thread ( ( ) - > {
for ( int i= 0 ; i< 10 ; i++ ) {
while ( state!= 0 ) {
synchronized ( o) {
try {
o. wait ( ) ;
} catch ( InterruptedException e) {
e. printStackTrace ( ) ;
}
}
}
state= ( state+ 1 ) % 3 ;
System. out. print ( "A" + i+ " " ) ;
synchronized ( o) {
o. notifyAll ( ) ;
}
}
} ) . start ( ) ;
new Thread ( ( ) - > {
for ( int i= 0 ; i< 10 ; i++ ) {
while ( state!= 1 ) {
synchronized ( o) {
try {
o. wait ( ) ;
} catch ( InterruptedException e) {
e. printStackTrace ( ) ;
}
}
}
state= ( state+ 1 ) % 3 ;
System. out. print ( "B" + i+ " " ) ;
synchronized ( o) {
o. notifyAll ( ) ;
}
}
} ) . start ( ) ;
new Thread ( ( ) - > {
for ( int i= 0 ; i< 10 ; i++ ) {
while ( state!= 2 ) {
synchronized ( o) {
try {
o. wait ( ) ;
} catch ( InterruptedException e) {
e. printStackTrace ( ) ;
}
}
}
state= ( state+ 1 ) % 3 ;
System. out. println ( "C" + i) ;
synchronized ( o) {
o. notifyAll ( ) ;
}
}
} ) . start ( ) ;
}
}
Lock
public class Main {
private static volatile int flag;
public static void main ( String[ ] args) throws InterruptedException {
Lock lock= new ReentrantLock ( ) ;
new Thread ( ( ) - > {
for ( int i= 0 ; i< 10 ; ) {
lock. lock ( ) ;
try {
if ( flag% 3 == 0 ) {
System. out. println ( "A" + i) ;
flag++ ;
i++ ;
}
} finally {
lock. unlock ( ) ;
}
}
} ) . start ( ) ;
new Thread ( ( ) - > {
for ( int i= 0 ; i< 10 ; ) {
lock. lock ( ) ;
try {
if ( flag% 3 == 1 ) {
System. out. println ( "B" + i) ;
flag++ ;
i++ ;
}
} finally {
lock. unlock ( ) ;
}
}
} ) . start ( ) ;
new Thread ( ( ) - > {
for ( int i= 0 ; i< 10 ; ) {
lock. lock ( ) ;
try {
if ( flag% 3 == 2 ) {
System. out. println ( "C" + i) ;
flag++ ;
i++ ;
}
} finally {
lock. unlock ( ) ;
}
}
} ) . start ( ) ;
}
}
Lock+Condition
public class Main {
private static volatile int flag;
public static void main ( String[ ] args) throws InterruptedException {
Lock lock= new ReentrantLock ( ) ;
Condition conditionA= lock. newCondition ( ) ;
Condition conditionB= lock. newCondition ( ) ;
Condition conditionC= lock. newCondition ( ) ;
new Thread ( ( ) - > {
lock. lock ( ) ;
try {
for ( int i = 0 ; i < 10 ; i++ ) {
while ( flag% 3 != 0 ) {
conditionA. await ( ) ;
}
flag++ ;
System. out. println ( "A" + i) ;
conditionB. signal ( ) ;
}
} catch ( InterruptedException e) {
e. printStackTrace ( ) ;
} finally {
lock. unlock ( ) ;
}
} ) . start ( ) ;
new Thread ( ( ) - > {
lock. lock ( ) ;
try {
for ( int i = 0 ; i < 10 ; i++ ) {
while ( flag% 3 != 1 ) {
conditionB. await ( ) ;
}
flag++ ;
System. out. println ( "B" + i) ;
conditionC. signal ( ) ;
}
} catch ( InterruptedException e) {
e. printStackTrace ( ) ;
} finally {
lock. unlock ( ) ;
}
} ) . start ( ) ;
new Thread ( ( ) - > {
lock. lock ( ) ;
try {
for ( int i = 0 ; i < 10 ; i++ ) {
while ( flag% 3 != 2 ) {
conditionC. await ( ) ;
}
flag++ ;
System. out. println ( "C" + i) ;
conditionA. signal ( ) ;
}
} catch ( InterruptedException e) {
e. printStackTrace ( ) ;
} finally {
lock. unlock ( ) ;
}
} ) . start ( ) ;
}
}
Semaphore
```java
public class Main {
public static void main ( String[ ] args) throws InterruptedException {
Semaphore semaphoreA= new Semaphore ( 1 ) ;
Semaphore semaphoreB= new Semaphore ( 0 ) ;
Semaphore semaphoreC= new Semaphore ( 0 ) ;
new Thread ( ( ) - > {
for ( int i= 0 ; i< 10 ; i++ ) {
try {
semaphoreA. acquire ( ) ;
System. out. println ( "A" + i) ;
semaphoreB. release ( ) ;
} catch ( InterruptedException e) {
e. printStackTrace ( ) ;
}
}
} ) . start ( ) ;
new Thread ( ( ) - > {
for ( int i= 0 ; i< 10 ; i++ ) {
try {
semaphoreB. acquire ( ) ;
System. out. println ( "B" + i) ;
semaphoreC. release ( ) ;
} catch ( InterruptedException e) {
e. printStackTrace ( ) ;
}
}
} ) . start ( ) ;
new Thread ( ( ) - > {
for ( int i= 0 ; i< 10 ; i++ ) {
try {
semaphoreC. acquire ( ) ;
System. out. println ( "C" + i) ;
semaphoreA. release ( ) ;
} catch ( InterruptedException e) {
e. printStackTrace ( ) ;
}
}
} ) . start ( ) ;
}
}