参考:http://www.cnblogs.com/icejoywoo/archive/2012/10/15/2724674.html
1、信号量Sephmore
public class SyncThreadTest {
private static Semaphore A = new Semaphore(1);
private static Semaphore B = new Semaphore(1);
private static Semaphore C = new Semaphore(1);
public static void main(String[] args) {
ThreadA a = new ThreadA();
ThreadB b = new ThreadB();
ThreadC c = new ThreadC();
try {
B.acquire();
C.acquire();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
a.start();
b.start();
c.start();
System.out.print("over\n");
}
static class ThreadA extends Thread {
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
try {
for(int i = 0; i < 10; i++) {
A.acquire();
System.out.print("thread a run" + i + "\n");
B.release();
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
static class ThreadB extends Thread {
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
try {
for(int i = 0; i < 10; i++) {
B.acquire();
System.out.print("thread b run" + i + "\n");
C.release();
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
static class ThreadC extends Thread {
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
try {
for(int i = 0; i < 10; i++) {
C.acquire();
System.out.print("thread c run" + i + "\n");
A.release();
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public class SyncThreadTestReentrantLock {
private static Lock lock = new ReentrantLock();
private static int state = 0;
public static void main(String[] args) {
ThreadA a = new ThreadA();
ThreadB b = new ThreadB();
ThreadC c = new ThreadC();
a.start();
b.start();
c.start();
/*try {
a.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
b.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
c.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}*/
System.out.print("over\n");
}
static class ThreadA extends Thread {
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
int i = 0;
while(i < 10) {
//System.out.print("thread a begin \n");
lock.lock();
//System.out.print("thread a lock \n");
if (state % 3 == 0) {
System.out.print("thread a run" + "\n");
state++;
i++;
}
lock.unlock();
//System.out.print("thread a end \n");
}
}
}
static class ThreadB extends Thread {
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
int i = 0;
while(i < 10) {
//System.out.print("thread b begin \n");
lock.lock();
//System.out.print("thread b lock \n");
if (state % 3 == 1) {
System.out.print("thread b run" + i + "\n");
state++;
i++;
}
lock.unlock();
//System.out.print("thread b end \n");
}
}
}
static class ThreadC extends Thread {
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
int i = 0;
while(i < 10) {
//System.out.print("thread c begin \n");
lock.lock();
//System.out.print("thread c lock \n");
if (state % 3 == 2) {
System.out.print("thread c run" + i + "\n");
state++;
i++;
}
lock.unlock();
//System.out.print("thread c end \n");
}
}
}
}
3、ReetrantLock和Condition的组合
还可以使用condition, condition的效率可能会更高一些, await会释放lock锁, condition的await和signal与object的wait和notify方法作用类似
public class SyncThreadTestReentrantLock {
private static Lock lock = new ReentrantLock();
private static int state = 0;
private static Condition A = lock.newCondition();
private static Condition B = lock.newCondition();
private static Condition C = lock.newCondition();
public static void main(String[] args) {
ThreadA a = new ThreadA();
ThreadB b = new ThreadB();
ThreadC c = new ThreadC();
a.start();
b.start();
c.start();
/*try {
a.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
b.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
c.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}*/
System.out.print("over\n");
}
static class ThreadA extends Thread {
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
int i = 0;
lock.lock();
try {
while(i < 10) {
//System.out.print("thread a begin \n");
//System.out.print("thread a lock \n");
if (state % 3 == 0) {
System.out.print("thread a run" + "\n");
state++;
i++;
B.signal();
} else {
A.await();
}
//lock.unlock();
//System.out.print("thread a end \n");
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
static class ThreadB extends Thread {
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
int i = 0;
lock.lock();
try {
while(i < 10) {
//System.out.print("thread a begin \n");
//System.out.print("thread a lock \n");
if (state % 3 == 1) {
System.out.print("thread b run" + "\n");
state++;
i++;
C.signal();
} else {
B.await();
}
//lock.unlock();
//System.out.print("thread a end \n");
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
static class ThreadC extends Thread {
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
int i = 0;
lock.lock();
try {
while(i < 10) {
//System.out.print("thread a begin \n");
//System.out.print("thread a lock \n");
if (state % 3 == 2) {
System.out.print("thread c run" + "\n");
state++;
i++;
A.signal();
} else {
C.await();
}
//lock.unlock();
//System.out.print("thread a end \n");
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
}