关键字synchronized
2018年11月5日
synchronized是Java中用来处理多线程的字段,也是我刚开始接触多线程时碰到的字眼,此篇记录下关于synchronized的一些理解和学习记录。
synchronized是什么?
synchronized是Java语法中的一个关键字,它可以作用在方法体和代码块上。这个关键字在被编译之后,会形成monitorenter和monitorexit两个字节码指令。这两个指令表示同步块的进入和退出,执行monitorenter时,线程尝试去获取锁的对象,如果获取成功,锁计数+1;执行到monitorexit时,锁计数-1,锁被释放。另一种说法就是sychronized就是JVM的这两个字节码指令暴露给程序员使用的接口。
synchronized修饰方法与代码块的区别
synchronized在修饰代码块时,会传递一个锁参数,如果这个参数是this的话,那同步代码块和同步方法也没什么区别。这种也叫做静态同步,它锁定的是类。另一种为非静态同步,锁定的是类的实例。在以实例为锁的情况下,在使用同一实例的时候就只能有一个线程可以进入同步块。
synchronized与Lock的区别
- Lock是一个接口,而synchronized是java的一个关键字,synchronized是内置的语言实现,Lock底层由volatile和CAS实现
- synchronized在发生异常时候会自动释放占有的锁,因此不会出现死锁;而lock发生异常时候,不会主动释放占有的锁,必须手动unlock来释放锁,可能引起死锁的发生。(所以最好将同步代码块用try catch包起来,finally中写入unlock,避免死锁的发生。)
- Lock等待锁过程中可以用interrupt来中断等待,而synchronized只能等待锁的释放,不能响应中断;
- Lock可以通过trylock来知道有没有获取锁,而synchronized不能;
- Lock可以提高多个线程进行读操作的效率。(可以通过readwritelock实现读写分离)