多线程并发访问对象或者变量时要保证线程安全就要使用关键字 synchronized 。
提到synchronized,就不得不提另外一个同胞兄弟 lock 了,先对他们做下比较:
1,lock覆盖了synchronized 的语义和内存性,但是有其他扩展功能,比如-定时锁等候
使用synchronized来锁定一个对象,其他想要申请这个对象的线程只能无限期等待下去直到对象被释放;而使用lock ,可以配置一个等候时间,到了等候时间还是没有申请到 对象就会中断等待去做其他事情。
2,synchronized是由jvm层面来调度,而lock是由程序控制,也就是说lock必须由程序来释放,这就要求每一个lock后面都要执行 finally(unlock)
3,在资源竞争不紧张时候,使用synchronized性能比较高,而资源紧张时候,使用synchronized的性能下降几十倍,而lock的使用性能不会有变化。
由于synchronized是java50个关键字之一,属于native方法,即它的底层实现源码已经不是java了,有兴趣的童鞋也可以去看看。