1、synchronized
package threadT;public class TestPrint { static int i = 1; public static void main(String[] args) throws Exception { final Object obj = new Object(); Thread t1 = new Thread(new Runnable() { public void run() { try { while (true) { synchronized (obj) { Thread.sleep(1000); obj.notifyAll(); obj.wait(); if (i == 1) System.out.println(i++ % 3); } } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); Thread t2 = new Thread(new Runnable() { public void run() { try { while (true) { synchronized (obj) { Thread.sleep(1000); obj.notifyAll(); obj.wait(); if (i == 2) System.out.println(i++ % 3); } } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); Thread t3 = new Thread(new Runnable() { public void run() { try { while (true) { synchronized (obj) { Thread.sleep(1000); obj.notifyAll(); obj.wait(); if (i == 3) { System.out.println(3); i = 1; } } } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); t1.start(); t2.start(); t3.start(); };}
2、ReentrantLock
package threadT;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class TestPrint { private static Lock lock = new ReentrantLock(); private static int state = 0; static class First extends Thread { @Override public void run() { while (true) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } lock.lock(); if (state % 4 == 0) { System.out.println("1"); state++; } lock.unlock(); } } } static class Second extends Thread { @Override public void run() { while (true) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } lock.lock(); if (state % 4 == 1) { System.out.println("2"); state++; } lock.unlock(); } } } static class Third extends Thread { @Override public void run() { while (true) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } lock.lock(); if (state % 4 == 2) { System.out.println("3"); state++; } lock.unlock(); } } } static class Forth extends Thread { @Override public void run() { while (true) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } lock.lock(); if (state % 4 == 3) { System.out.println("4"); state++; } lock.unlock(); } } } public static void main(String[] args) { First first = new First(); Second second = new Second(); Third third = new Third(); Forth forth = new Forth(); first.start(); second.start(); third.start(); forth.start(); }}
3、Semaphore
package threadT;import java.util.concurrent.Semaphore;public class TestPrint { public static Semaphore sem1; public static Semaphore sem2; public static Semaphore sem3; public static Semaphore sem4; static class FirstThread extends Thread { @Override public void run() { try { while (true) { Thread.sleep(1000); sem1.acquire(); System.out.println("1"); sem2.release(); } } catch (InterruptedException e) { e.printStackTrace(); } } } static class SecondThread extends Thread { @Override public void run() { try { while (true) { Thread.sleep(1000); sem2.acquire(); System.out.println("2"); sem3.release(); } } catch (InterruptedException e) { e.printStackTrace(); } } } static class ThirdThread extends Thread { @Override public void run() { try { while (true) { Thread.sleep(1000); sem3.acquire(); System.out.println("3"); sem4.release(); } } catch (InterruptedException e) { e.printStackTrace(); } } } static class ForthThread extends Thread { @Override public void run() { try { while (true) { Thread.sleep(1000); sem4.acquire(); System.out.println("4"); sem1.release(); } } catch (InterruptedException e) { e.printStackTrace(); } } } public static void main(String[] args) { sem1 = new Semaphore(1); sem2 = new Semaphore(1); sem3 = new Semaphore(1); sem4 = new Semaphore(1); try { // 不要有sem1.acquire() sem2.acquire(); sem3.acquire(); sem4.acquire(); } catch (InterruptedException e) { e.printStackTrace(); } new FirstThread().start(); new SecondThread().start(); new ThirdThread().start(); new ForthThread().start(); }}
4、volatile
package threadT;public class TestPrint { volatile static int state = 0; static class First extends Thread { @Override public void run() { while (true) { try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } if (state % 4 == 0) { System.out.println("1"); state++; } } } } static class Second extends Thread { @Override public void run() { while (true) { try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } if (state % 4 == 1) { System.out.println("2"); state++; } } } } static class Third extends Thread { @Override public void run() { while (true) { try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } if (state % 4 == 2) { System.out.println("3"); state++; } } } } static class Forth extends Thread { @Override public void run() { while (true) { try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } if (state % 4 == 3) { System.out.println("4"); state++; } } } } public static void main(String[] args) { First first = new First(); Second second = new Second(); Third third = new Third(); Forth forth = new Forth(); first.start(); second.start(); third.start(); forth.start(); }}