那到底使用synchronized关键字是不是就是一个监视器? 不懂,理解的话可以向我发邮件gaomengjie_1@163.com,我虚心求教
之前介绍如何使用Lock和Condation 详情请查看传送门
介绍一下锁和条件的关键之处
public synchronized void method(){
......
}
// 等价于
public void method(){
this.initLock.lock();
try{
// method
}finaly{
this.initLock.unlock();
}
}
synchronized 方法中使用wait方法是添加一个线程到等待集中,notifyAll /notify 方法解除等待线程的阻塞状态
将静态方法声明为synchronized也是合法的,这样会获得相关类对象的内部锁。如果Bank类有一个静态的同步方法,当该方法被调用时,Bank.class对象会被锁住,没有任何其他的线程可以调用同一个类的静态方法
synchronized关键字加锁
每个对象含有锁,线程可以通过调用同步方法获得锁。还有 另一种机制可以获得锁, 通过进入一个同步阻塞。
也就是如下形式的阻塞:
// 获得object的锁
synchronized (obj) // this is the syntax for a synchronized block
{
// do some work
}
我们也可以在转账操作中这样使用
public class Bank{
private Object lock = new Object();
public void transfer(int from ,int to ,int amount){
synchronized (lock) // an ad-hoc lock
{
accounts[from] -= amount;
accounts[to] += amount;
}
}
}
监视器可以在不需要加锁的情况下保持线程的安全性
volatile 关键字为实例域的同步访问提供了一种免锁机制。通知编译器和处理器此处可能并发更新,但Volatile操作并不是原子性的。保证安全读取
今天就到这吧,看不下去了这一章节!!