继续面试大纲系列文章。
从这一篇开始,我们进入ava编程中的一个重要领域---多线程!多线程就像武学中对的吸星大法,理解透了用好了可以得道成仙,俯瞰芸芸众生;而滥用则会遭其反噬。
在多线程编程中要渡的首个“劫”,则是Synchronized。了解其底层实现,无论是在面试中还是在平时工作中,都大有裨益。我们知其然,知其所以然,才能得心应手少挖坑。
我们知道,多线程的核心思想是通过增加线程数量来并发的运行,来提高效率,也就是数量决胜论,而不是质量决胜(提高每个线程的处理能力)。多线程编程中面临的最大挑战,是如何解决多个线程同时修改一个公用的变量所带来的变量值不确定性问题。顺着这个思路分析,常用办法,无非就是,要么对变量动手,在一个线程修改时,变量值被锁定。要么是对修改的操作动手,在该段代码执行时,对其加锁,其他线程不可以在同一时刻进入该段代码执行。
Synchronized,正是实现了后一种办法。
public class test extends java.lang.Object{
public test();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."":()V
4: nop
5: return
public static void main(java.lang.String[]);
Code:
0: new #2; //class Object
3: dup
4: invokespecial #1; //Method java/lang/Object."":()V
7: dup
8: astore_1
9: monitorenter // Enter the monitor associated with object
10: iconst_0
11: istore_2
12: nop
13: aload_1
14: monitorexit // Exit the monitor associated with object
15: goto 23
18: astore_3
19: aload_1
20: monitorexit // Be sure to exit monitor...
21: aload_3
22: athrow
23: nop
24: return
Exception table:
from to target type
10 15 18 any
18 21 18 any
}
1 public class test {
2 public test() {
3 }
4 public static void main(String[] args) {
5 synchronized(new Object()){
6 int i = 0;
7 }
8 }
9 }
4.扩展:Synchronized提供了以下几种类型的锁:偏向锁、轻量级锁、重量级锁。在大部分情况下,并不存在多线程竞争,更常见的是一个线程多次获取同一个锁。那么很多的消耗,其实是在锁的获取与释放上。Synchronized一直在被优化,可以说Synchronized虽然推出的较早,但是效率并不比后来推出的Lock差。