java中的锁的分类有很多,大多数都是根据锁的某项功能或者特性进行分类,所以在项目中选择哪种锁是门大学问
乐观锁和悲观锁
乐观锁
乐观的认为不会有线程同时执行,最常见的就是sql中的,update table set a=更改值 where a=更改前的值;
悲观锁
悲观的认为肯定会有线程同时执行,在更新数据的时候先把资源锁住,当其他线程执行时会等待前一个线程释放锁,sql中的select for update
公平锁和非公平锁
关键词:fair
公平锁
获取锁之前会先看看排队的队列中是否有数据,如果有先让其先执行,换个说法,在执行锁的时候会把队列的第一个线程取出执行
非公平锁
来了就直接获取锁,不管排队队列,性能比公平锁好很多,毕竟公平锁在使用的同时为了保证“公平性”需要额外维护一个队列
公平锁:先加锁的先执行
非公平锁:不分先后,后来的很可能先执行
扩展:在SychronousQueue中的构造方法中就可以设置使用公平锁还是非公平锁,默认是非公平锁