Synchronized的作用:
能够保证在同一时刻最多只有一个线程执行该段代码,以达到保证并发安全的效果。
并发编程的地位:
关键字,被java原生支持,实现互斥的基本手段、是研究高并发的基础。
不使用并发手段会有什么样的后果:
例如i++的操作,如果不使用同步的话会线程不安全。
Synchronized的两种使用方式:
对象锁(方法锁、同步代码块锁),类锁(被Synchronized修饰的静态方法、锁为Class对象)。
多线程的三个核心思想:
1、一把锁只能同时被一个线程占有,那些拿到锁的线程必须等待。
2、每个实例都对应有自己的一把锁,不同的实例之间互不影响(例外:锁对象是*.class或被synchronized修饰的static方法时所有对象公用一把锁)
3、无论方法是异常抛抛错还是正常结束,JVM都会自己释放锁。
常见的面试问题:
1、两个线程同时访问一个对象的同步方法会怎么样? -- 锁对象的this,所以两个线程串行
2、两个线程访问两个两个对象的同步方法会怎么样? --锁对象不同,所以和普通方法没有区别
3、如果两个线程访问的是被Synchronized修饰静态方法呢?--锁对象是类锁,所以还是串行
4、同时访问同步和非同步方法呢? 线程并行,Synchronized只作用与一个方法中,内部调了非静态方法(没有被修饰的)是不会有任何同步效果的
5、访问同一对象不同的普通同步方法呢? --线程并行
6、同时访问一个静态的和非静态的同步方法呢?--线程并行
7、方法抛出后会释放锁码?--会