同步与异步的分别
public class MyObj {
synchronized public void mA() {
}
}
public class MyObj {
synchronized static public void mA() {
}
}
等同于
public class MyObj {
static public void mA() {
synchronized(MyObj.class) {
}
}
}
public class MyObj {
public void mA() {
synchronized (this) {
}
}
}
synchronized ==> 当两个线程操作同一个类对象的 synchronized 方法或代码块(可以是不同的 synchronized 方法或代码块)时,会产生同步的效果
synchronized ==> 当两个线程操作同一个类对象的两个方法(一个 synchronized 方法,另一个非 synchronized 方法)时,不会产生同步的效果
synchronized ==> 当两个线程操作同一个类的两个对象时,不会产生同步的效果
wait() ==> 锁自动释放 ==> 就是说执行 wait() 方法后,wait() 方法后续的代码不会继续执行,即刻释放锁
notifiy() ==> 锁不自动释放 ==> 就是说执行 notifiy() 方法后,notifiy() 方法后续的代码会继续执行到方法完成,即不会立刻释放锁
join() ==> join 在内部使用 wait() 方法进行等待,由于 wait 具有释放锁的特点,所以 join 也具有释放锁的特点
ThreadLocal 是为了解决线程的共享变量,每个线程自己的共享变量
InheritableThreadLocal 可以在子线程中取得父线程继承下来的值
Condition
// 公平锁
new ReentrantLock(true);
// 非公平锁
new ReentrantLock(flase);
读锁 & 读锁 ==> 不互斥
读锁 & 写锁 ==> 互斥
写锁 & 写锁 ==> 互斥
《java 多线程编程核心技术》
《图解 java 多线程设计模式》