公平锁: 是指多个线程获取锁时, 按照申请锁的顺序来获取锁
非公平锁: 多个线程获取锁时并不是按照顺序来获取, 有可能后申请的线程会直接尝试获取锁, 这一定程度上会优化性能, 但可能会造成优先级翻转和饥饿现象
可重入锁: 外层函数获得锁后, 内层函数仍能获取锁; 也就是说同一个线程在外层函数获取锁的时候, 进入内层函数会自动获取锁
自旋锁: 尝试获取锁失败的线程不会立即进入阻塞, 而是会采用循环的方式不对尝试获取锁, 好处是减少了上下文切换的消耗, 缺点是循环会消耗cpu
读写锁: 允许多个线程同时读一个资源, 但如果有一个线程在写一个资源, 则不允许其他线程对这个资源进行读或写操作
乐观锁: 认为自己在使用数据时不会有别的线程修改数据,所以不会添加锁,只是在更新数据的时候去判断之前有没有别的线程更新了这个数据。乐观锁在Java中是通过使用无锁编程来实现,最常采用的是CAS算法
悲观锁: 认为自己在使用数据的时候一定有别的线程来修改数据,因此在获取数据的时候会先加锁,确保数据不会被别的线程修改。Java中,synchronized关键字和Lock的实现类都是悲观锁。
偏向锁: 偏向锁是指一段同步代码一直被一个线程所访问,那么该线程会自动获取锁,降低获取锁的代价。
轻量级锁: 是指当锁是偏向锁的时候,被另外的线程所访问,偏向锁就会升级为轻量级锁,其他线程会通过自旋的形式尝试获取锁,不会阻塞,从而提高性能。
重量级锁: 若当前只有一个等待线程,则该线程通过自旋进行等待。但是当自旋超过一定的次数,或者一个线程在持有锁,一个在自旋,又有第三个来访时,轻量级锁升级为重量级锁。