synchronized和volatile的区别是什么?说明java乐观锁的原理
数据库会死锁嘛?举一个死锁的例子,MySQL怎么解决死锁?
说一下什么是公平锁?公平锁如何使用?公平锁有什么优点和缺点?公平锁使用场景

volatile和synchronized的区别
1.volatile本质是在告诉jvm当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取; synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。
3.volatile仅能使用在变量级别;synchronized则可以使用在变量、方法、和类级别的
4.volatile仅能实现变量的修改可见性,不能保证原子性;而synchronized则可以保证变量的修改可见性和原子性
4.volatile不会造成线程的阻塞;synchronized可能会造成线程的阻塞。
5.volatile标记的变量不会被编译器优化;synchronized标记的变量可以被编译器优化
乐观锁和悲观锁
互斥同步锁(悲观锁):
非互斥同步锁(乐观锁):
数据库死锁:添加链接描述

synchronized

demo1
两个线程去执行这个方法的时候,第一个线程先进来,执行test()方法,首先判断又没有拿到object这把锁,object在栈里面指向的是堆里面的一个对象,这个锁是唯一的,执行完了之后,这把锁就会被释放.释放之后第二个线程就可以拿到这把锁向下执行.
这里的对象用任何对象都可以,对这个对象也没有任何影响
锁
demo2
第二种写法,用this.如果每一次都要去新new一个对象专门来当锁有点麻烦,我们可以把当前对象的实例当成锁来使用.当这个方法被调用的时候,必须去new出来这个Demo,在堆里面就有了一个实例,这把锁就被创建出来了
锁
demo3
如果说一个方法在一开始就需要给它加锁,在结束的时候才给它释放掉,有一种简便的写法,在方法上直接加上synchronized关键字
锁
前三种:锁的不是方法锁的也不是代码,锁的是一个对象,里面做了什么事情不用去管,锁住这个对象之后做的事情就只能由拿到这把锁的人来进行执行
也不只是能用来锁对象
demo4
这里是一个静态方法,不能锁this,要锁class文件
锁
所以:锁住的东西有两种情况,一种是对象的实例,还有一种是类的class文件
demo5
锁
demo6
new了5个Demo,有五个run方法,所以打印出来都是9
锁
demo7
同步方法和非同步方法是可以同时调用的,之间没有什么关系,就像一个人去上厕所,一个人去洗手,没有关联
锁
demo9
一个同步方法调用调用另一个同步方法,可以得到锁
锁