1。synchronized和lock
synchronized是Java关键字,当它用来修饰一个方法或一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。
Lock是一个接口,而synchronized是Java中的关键字,synchronized是内置的语言实现;synchronized在发生异常时,会自动释放线程占有的锁,因此不会发生导致死锁现象发生;而Lock在发生异常时,如果没有主动通过unLock()去解锁,则很可能造成死锁现象,因此使用Lock是需要finally块中释放锁,Lock可以让等待锁的线程响应中断,而synchronized却不行,使用synchronized时,等待的线程会一直等待下去,不能够响应中断;通过Lock可以知道有没有获取锁,而synchronized却无法办到。
2.介绍volatile
volatile关键字是用来保证有序性和可见性的。这跟java内存模型有关。比如我们所写的代码,不一定是按照我们自己书写的顺序来执行的,编译器会做重排序,CPU也会做重排序,这样的重排序是为了减少流水线的阻塞的,引起流水阻塞,比如数据相关性,提高CPU的执行效率。需要有一定的顺序和规则来保证,不然程序员自己写的代码都不知道对不对了,所以有happen-beforre规则,其中有条就是volatile变量规则:对一个变量的写操作咸发生于后面对这个变量的读操作;
有序行实现的是通过插入内存屏障来保证的。可见性:首先Java内存模型分为主内存,工作内存。比如线程A从主内存把变量从读到工作内存中,做了+1操作,但是此时没有将i的最新值刷新会主内存中,线程B此时读到的还是i的旧值。加了valatile关键字的代码生成的汇编代码发现,会多处一个lock前缀指令。
3 Syncronized锁,如果用这个关键字修饰一个静态方法,锁住的类,线程想要执行对应同步代码,需要获得类锁。
synchronized修饰成员方法,线程获取的是当前调用该方法的对象实例的对象锁。