多线程是应对复杂工作,提高工作效率的重要方式。其中涉及到很多的多线程的关键字,synchronized关键字是接触的比较早的一个,做个整理,方便理解。
在java中synchronized关键字是同步锁,依赖于对象存在的。每一个对象有且仅有一个同步锁,当调用某对象的synchronized关键字时,就获得了该对象的同步锁。
synchronized关键字的原理
Synchronized是通过对象内部的一个叫做监视器锁(monitor)来实现的。但是监视器锁的本质是依赖于操作系统底层的操作系统的互斥锁来实现的。而操作系统实现线程间的切换就需要从用户态切换到核心态,成本非常高。这也是synchronized锁效率低,被称为重量级锁的原因。但是在jdk1.6之后,对synchronized做了很多优化,现在也已经越来越好用了。
synchronized关键字的特性
- synchronized是一个互斥锁,也是一个不公平锁。锁定的是一个对象。打比方说就是只有一个马桶(对象),门上有把锁,有3个人想上厕所(线程抢占),看谁先抢到,谁先上厕所。
- synchronized是可重入锁。什么是可重入锁?可重入锁在我看来类似于一个计数器,同一个线程的下,加了synchronized关键字的方法m1,m2可以相互调用而不发生死锁。
- synchronized关键字的几种用法是等同的,例子如下:
1.synchronizeed(this){}
<>public synchronized void m(){}
;
2.synchronized(T.class)
<>public synchronized static void m(){}