合理的使用Java 多线程可以更好地利用服务器资源,我们有时候需要线程之间的相互协作的时候,就需要掌握Java 线程的通信方式。

锁与同步

在Java 中,锁的概念都是基于对象的,所以我们又经常称他为对象锁。一个锁同一时间只能被一个线程持有,其他线程如果需要得到这个锁,就得等这个线程释放锁。

线程同步是线程之间按照 一定的顺序执行

  1. public class ObjectLock {
  2. private static Object lock = new Object();
  3. static class ThreadA implements Runnable{
  4. @Override
  5. public void run() {
  6. synchronized (lock) {
  7. for (int i = 0; i < 100; i++) {
  8. System.out.println("threadA" + i);
  9. }
  10. }
  11. }
  12. }
  13. static class ThreadB implements Runnable{
  14. @Override
  15. public void run() {
  16. synchronized (lock) {
  17. for (int i = 0; i < 100; i++) {
  18. System.out.println("threadA" + i);
  19. }
  20. }
  21. }
  22. }
  23. public static void main(String[] args) throws InterruptedException {
  24. new Thread(new ThreadA()).start();
  25. //防止线程B先得到锁
  26. Thread.sleep(10);
  27. new Thread(new ThreadB()).start();
  28. }
  29. }

根据线程和锁的关系,同一时间只有一个线程持有一个锁,那么线程B 就会等线程A执行完成后释放 lock ,线程B 才能获得 lock.
基于锁的方式,线程需要不断地去尝试获得锁,如果失败了,在继续尝试,这可能会耗费服务器资源。


等待/ 通知机制

Java 多线程等待/ 通知机制是基于 Object 类的 wait() 方法和 notify() , notifyAll() 方法实现的。