1.JVM内存模型
2.JVM如何解决原子性、可见性、有序性的问题
3.volatie 和 synchronized
synchronized 的实现原理和应用
synchronized有三种方式来加锁:1.修饰实例方法,两个线程同时访问同一个实例对象中的方法 synchronized(this) 时候会发生有一个会被阻塞。
public class Demo extends Thread {
@Override
public void run() {
synchronized(this) {
System.out.println(this.hashCode() + " : " + LocalDateTime.now());
try {
//休眠10秒
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
Demo demo = new Demo();
//创建两个线程实例
Thread t1 = new Thread(demo, "线程A");
Thread t2 = new Thread(demo, "线程B");
t1.start();
t2.start();
}
}
输出结果:
A : 2019-05-15T11:40:40.882
B : 2019-05-15T11:40:50.887
可以发现B线程执行时间比A线程晚了10秒。
修改main方法 :
public static void main(String[] args) {
//创建两个实例
Demo demo = new Demo();
Demo demo2 = new Demo();
//创建两个线程实例
Thread t1 = new Thread(demo, "线程A");
Thread t2 = new Thread(demo2, "线程B");
t1.start();
t2.start();
}
输出结果:
A : 2019-05-15T11:40:40.882
B : 2019-05-15T11:40:40.887
可以发现并没有出现锁同步的情况,两个线程是并发进行的
2.修饰代码块,指定加锁对象