1 锁 + wait + notify
public class PrintTwoThreads {
private static int i = 0 ;
private static final Integer mtx = 0 ;
private static final int MAX_PRINT_NUMBER = 9 ;
public static void main ( String [ ] args) {
new Thread ( ( ) -> {
while ( i <= MAX_PRINT_NUMBER) {
synchronized ( mtx) {
if ( ( i & 1 ) == 1 ) {
try {
mtx. wait ( ) ;
} catch ( InterruptedException e) {
e. printStackTrace ( ) ;
}
} else {
System . out. println ( "Thread1: " + i++ ) ;
mtx. notify ( ) ;
}
}
}
} ) . start ( ) ;
new Thread ( ( ) -> {
while ( i <= MAX_PRINT_NUMBER) {
synchronized ( mtx) {
if ( ( i & 1 ) == 0 ) {
try {
mtx. wait ( ) ;
} catch ( InterruptedException e) {
e. printStackTrace ( ) ;
}
} else {
System . out. println ( "Thread2: " + i++ ) ;
mtx. notify ( ) ;
}
}
}
} ) . start ( ) ;
}
}
2 Lock + Condition
import java. util. concurrent. locks. Condition ;
import java. util. concurrent. locks. Lock ;
import java. util. concurrent. locks. ReentrantLock ;
public class PrintTwoThreads {
private static int i = 0 ;
private static final int MAX_PRINT_NUMBER = 9 ;
public static void main ( String [ ] args) {
Lock lock = new ReentrantLock ( ) ;
Condition condition = lock. newCondition ( ) ;
new Thread ( ( ) -> {
while ( i <= MAX_PRINT_NUMBER) {
try {
lock. lock ( ) ;
if ( ( i & 1 ) == 1 ) {
condition. await ( ) ;
} else {
System . out. println ( "Thread1: " + i++ ) ;
condition. signal ( ) ;
}
} catch ( Exception e) {
System . out. println ( e) ;
} finally {
lock. unlock ( ) ;
}
}
} ) . start ( ) ;
new Thread ( ( ) -> {
while ( i <= MAX_PRINT_NUMBER) {
try {
lock. lock ( ) ;
if ( ( i & 1 ) == 0 ) {
condition. await ( ) ;
} else {
System . out. println ( "Thread2: " + i++ ) ;
condition. signal ( ) ;
}
} catch ( Exception e) {
System . out. println ( e) ;
} finally {
lock. unlock ( ) ;
}
}
} ) . start ( ) ;
}
}
3 volatile + 自旋锁
import java. util. concurrent. locks. Condition ;
import java. util. concurrent. locks. Lock ;
import java. util. concurrent. locks. ReentrantLock ;
public class PrintTwoThreads {
private static volatile int i = 0 ;
private static final int MAX_PRINT_NUMBER = 9 ;
public static void main ( String [ ] args) {
new Thread ( ( ) -> {
while ( i <= MAX_PRINT_NUMBER) {
if ( ( i & 1 ) == 0 ) {
System . out. println ( "Thread1: " + i) ;
i++ ;
}
}
} ) . start ( ) ;
new Thread ( ( ) -> {
while ( i <= MAX_PRINT_NUMBER) {
if ( ( i & 1 ) == 1 ) {
System . out. println ( "Thread2: " + i) ;
i++ ;
}
}
} ) . start ( ) ;
}
}