the java syncrhonisers

来源:互联网 发布:wp 添加js 编辑:程序博客网 时间:2024/06/06 02:25

原文:https://www.javacodegeeks.com/2016/08/the-java-syncrhonisers.html
线程通信主要发生在共享字段河对象的时候。尽管这样做非常的有效,但这种通信方式,容易发生线程阻塞河内存一致性问题。Synchronization是一个防止这些问题的工具。
然而synchronization并不是完美的,它会带来隐患档当试图获得一个正在被其他线程持有的锁或对象。等待线程不能使用这个对象,指导其他线程释放掉这个锁或对象。这种情况就是锁竞争(Thread Contention).这样会导致思索。
接下来我们要来哦接java提供的用来出来线程同步的方法。
Synchronization essentials
java提供了一些列的机制用来处理线程同步和协作。它支持细粒度的使用synchronized方法,synchronized语句块来实现对对象的同步访问。基本的线程协作可以通过保护块(guarded blocks)来完成。上边所有提到的方法都给予对对象内置所的获取和释放。
Intrinsic Lock
所有的java对象都有自己的内置锁。一个线程如果像独占一个对象的字段就得在访问这个对象之前获得对象的锁,在使用完以后释放掉对象的内置锁。其他的线程尝试访问这个对象会被阻塞指导占有这个对象的线程释放掉锁。
Synchronized Methods
当一个线程调用同步方法,它必须先获得这个方法所在的对象的内置锁并且在方法返回时释放锁。即使这个方法反悔了一个未不活的异常锁也会被释放掉。如果是个一个static方法,线程必须获得和类相关的类对象的锁。
Guarded Blocks
之前讲的,保护块(guarded blocks)提供了对线程协作的支持。同步语句块(sychronized statement)必须明确提供内置锁的对象
eg: sychronized(ob) {
//todo
}
保护块是java对象的一部分,可以通过wait,notify和notifyAll这些方法来创建。
wait方法中止当前线程。当一个线程调用wait方法,它必须持有这个对象的内置锁,这就是对wait方法的调用通常被包裹在同步方法或同步语句块内。调用wait方法中止当前线程的执行并释放锁。
某些时候,其他线程也会持有对象的内置锁并且调用notifyAll方法,作用是使所有的线程等待(进入waiting queue),直到有第二个线程释放掉锁,等待线程在等获得锁,并从调用wait方法处恢复执行。
notify唤醒单个线程。notfiy随机唤醒一个线程。notify方法只有在我们不关系是谁被唤醒是才有效。

0 0