Java编程语言为线程之间的通信提供了多种机制。
这些方法中最基本的一种方法是synchronization,它是使用monitors 监视器来实现的。
Java中的每个对象都与一个监视器相关联,一个线程可以锁定或解锁该监视器。
一次只有一个线程可以保持监视器上的锁。
试图锁定该监视器的任何其他线程将被阻止,直到它们能够获得该监视器的锁定。
线程 t 可以多次锁定特定的监视器;每次解锁都会反转一个锁定操作的效果。
synchronized语句计算对对象的引用。
然后,它尝试在该对象的监视器上执行锁定操作,在锁定操作成功完成之前不会继续进行。
在执行了锁定动作后,将执行 synchronized 语句的主体。
如果主体的执行已完成,无论是正常的或突然,都将在同一监视器上自动执行解锁操作。
synchronized 方法在被调用时自动执行锁定操作;在锁定操作成功完成之前,不会执行其主体。
如果该方法是一个实例方法,那么它将锁定与被调用它的实例关联的监视器(即,在执行方法主体期间将被称为 this 的对象)。
如果方法是static,则它将锁定与表示定义方法的类的Class对象关联的监视器。
如果方法主体的执行已经完成,无论是正常完成或是突然完成,都在同一监视器上自动执行解锁操作。
Java编程语言既不阻止也不需要检测死锁条件。
线程(直接或间接地)在多个对象上保持锁定的程序应该使用传统的避免死锁的技术,并在必要时创建不发生死锁的更高级别的锁定原语。
其他机制,如易失性变量的读写和 java.util.concurrent 包中类的使用,提供了不同的同步方法。
java.util.concurrent
Interfaces
- BlockingDeque
- BlockingQueue
- Callable
- CompletableFuture.AsynchronousCompletionTask
- CompletionService
- CompletionStage
- ConcurrentMap
- ConcurrentNavigableMap
- Delayed
- Executor
- ExecutorService
- ForkJoinPool.ForkJoinWorkerThreadFactory
- ForkJoinPool.ManagedBlocker
- Future
- RejectedExecutionHandler
- RunnableFuture
- RunnableScheduledFuture
- ScheduledExecutorService
- ScheduledFuture
- ThreadFactory
- TransferQueue
Classes
- AbstractExecutorService
- ArrayBlockingQueue
- CompletableFuture
- ConcurrentHashMap
- ConcurrentHashMap.KeySetView
- ConcurrentLinkedDeque
- ConcurrentLinkedQueue
- ConcurrentSkipListMap
- ConcurrentSkipListSet
- CopyOnWriteArrayList
- CopyOnWriteArraySet
- CountDownLatch
- CountedCompleter
- CyclicBarrier
- DelayQueue
- Exchanger
- ExecutorCompletionService
- Executors
- ForkJoinPool
- ForkJoinTask
- ForkJoinWorkerThread
- FutureTask
- LinkedBlockingDeque
- LinkedBlockingQueue
- LinkedTransferQueue
- Phaser
- PriorityBlockingQueue
- RecursiveAction
- RecursiveTask
- ScheduledThreadPoolExecutor
- Semaphore
- SynchronousQueue
- ThreadLocalRandom
- ThreadPoolExecutor
- ThreadPoolExecutor.AbortPolicy
- ThreadPoolExecutor.CallerRunsPolicy
- ThreadPoolExecutor.DiscardOldestPolicy
- ThreadPoolExecutor.DiscardPolicy