这是一个学习记录文档,主要学习的视频时慕课网的《Java高并发之魂:synchronized深度解析》
将主要的知识点记录下来,老师最后总结的 思维导图 很棒。
以原子的形式执行。先拿到锁。
Synchronized的两种用法
// 手动指定锁对象。
synchronized(this) {
//代码块
mDirtyFlags = 0x4L;
}
public class TestSyncObject implements Runnable{
@Override
public void run() {
synchronized (this){
System.out.println("thread start:" + Thread.currentThread().getName());
try {
Thread.sleep(400);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("thread end,"+ Thread.currentThread().getName() );
}
}
public static void main(String[] args) {
System.out.println("hello world!" + System.currentTimeMillis());
TestSyncObject object = new TestSyncObject();
Thread thread1 = new Thread(object);
Thread thread2 = new Thread(object);
thread1.start();
thread2.start();
try {
thread1.join();
thread2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("end!" + System.currentTimeMillis());
}
}
(面试中)访问同步方法的中的7种情况:
1 | 两个线程同时访问一个对象的同步方法 | synchronized起作用,两个线程在同一时间只能有一个访问 |
2 | 两个线程访问的是两个对象的同步方法 | synchronized不起作用,两个线程并行执行 |
3 | 两个线程访问的是synchronized的静态方法 | 两个线程执行的是同一个锁,所以一个执行完,另一个才执行 |
4 | 两个线程同时分别访问同一个对象的同步方法与非同步方法 | 两个方法会同时执行。 |
5 | 两个线程同时访问同一个对象的不同的普通同步方法 | synchronized锁的是对象,不是方法,所以异步执行。 |
6 | 同时访问静态synchronized和非静态的synchronized方法 | 静态synchronized锁的是类锁,非静态的synchronized锁的是对象锁,两个锁不一样,所以可以同时运行 |
7 | 方法抛出异常后,会释放锁 | synchronized方法类抛出异常后,会自动释放锁,第二个线程会立刻执行。这个个lock不一样。 |
注意第6点。类锁,是对这个类中的所有对象都起作用。
java中的两个可重入锁:synchronize 和 reentrantLock
加锁和释放锁的时机:进入到同步代码块。
深入JVM字节码:class文件格式有 monitor 指令。
反编译:
javap命令:
实际加锁和解锁的命令是使用的 monitorEnter 和 monitorExit 。
monitor 计数器默认是0;加锁后加1,解锁后减1。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
以下是慕课网《剑指Java面试-Offer直通车》的讲解: