合理的使用Java 多线程可以更好地利用服务器资源,我们有时候需要线程之间的相互协作的时候,就需要掌握Java 线程的通信方式。
锁与同步
在Java 中,锁的概念都是基于对象的,所以我们又经常称他为对象锁。一个锁同一时间只能被一个线程持有,其他线程如果需要得到这个锁,就得等这个线程释放锁。
线程同步是线程之间按照 一定的顺序执行
public class ObjectLock {
private static Object lock = new Object();
static class ThreadA implements Runnable{
@Override
public void run() {
synchronized (lock) {
for (int i = 0; i < 100; i++) {
System.out.println("threadA" + i);
}
}
}
}
static class ThreadB implements Runnable{
@Override
public void run() {
synchronized (lock) {
for (int i = 0; i < 100; i++) {
System.out.println("threadA" + i);
}
}
}
}
public static void main(String[] args) throws InterruptedException {
new Thread(new ThreadA()).start();
//防止线程B先得到锁
Thread.sleep(10);
new Thread(new ThreadB()).start();
}
}
根据线程和锁的关系,同一时间只有一个线程持有一个锁,那么线程B 就会等线程A执行完成后释放 lock ,线程B 才能获得 lock.
基于锁的方式,线程需要不断地去尝试获得锁,如果失败了,在继续尝试,这可能会耗费服务器资源。
等待/ 通知机制
Java 多线程等待/ 通知机制是基于 Object 类的 wait() 方法和 notify() , notifyAll() 方法实现的。