Java多线程锁是什么?这个问题就由极悦java培训机构的小编来为大家解答。
Java中的锁有以下几种:
一、可重入锁:
1. 当一个线程再次获取它自己已经获取的锁时,如果不被阻塞,则说明该锁是可重入锁,也就是只要该线程获取了该锁,那么可以无限次数地进入被该锁锁住的代码里。相反,如果被阻塞了,说明是不可重入锁。
2. synchronized内部锁是可重入锁。可重入锁的原理:在锁内部维护一个线程标示,用来标示该锁目前被哪个线程占用。
当一个线程获取了该锁时。计数器的值会变成1,这时其他线程再来获取该锁时会发现锁的所有者不是自己而被阻塞挂起。但是当获取了该锁的线程再次获取锁时发现锁拥有者是自己,就会把计数器值加+1,当释放锁后计数器值-1。当计数器的值为0时,锁里面的线程标示被重置为null,这时被阻塞的线程会被唤醒来竞争获取该锁。
二、死锁
死锁:当一个线程永远的持有一把锁,并且其他线程都尝试来获得这把锁时,就会发生死锁。
多个线程互相拥有锁,互不释放锁,造成线程死锁。
可以通过cmd命令窗口中输入jconsole命令来检测线程情况,查看死锁。
三、自旋锁
自旋锁:当前线程在获取锁时,如果发现锁已经被其他线程占有,它不会马上阻塞自己,在不放弃CPU使用权的情况下,多次尝试获取(默认次数是10,可以通过使用-XX:PreBlockSpinsh参数设置该值),很有可能在后面的几次尝试中其他线程已经释放了锁。而如果尝试指定的次数后仍没有获取到锁,则当前线程才会被阻塞挂起。
自旋锁是使用CPU时间换取线程阻塞与调度的开销,但是很有可能这些CPU时间白白浪费了。
四、Lock锁
1. Lock锁需要显示地获取lock()和释放锁unlock(),繁琐,但是代码编写灵活。
Synchronized不需要显示地获取和释放锁,简单。
2. 使用Lock可以方便的实现公平性;
3. Lock可以非阻塞的获取锁,能被中断的获取锁,也能超时获取锁;
五、独占锁和共享锁
1. 根据锁只能被单个线程持有还是能被多个线程共同持有,锁可以分为独占锁和共享锁。
独占锁:它保证任何时候都只有一个线程能得到锁,ReetrantLock就是以独占方式实现的。
共享锁:它可以同时由多个线程持有,如ReadWriteLock读写锁,它允许一个资源可以被多个线程同时进行操作。
2. 独占锁是一种悲观锁,由于每次访问资源都先加上互斥锁,这就限制了并发性,因为读操作并不会影响数据的一致性,不存在线程安全问题,而独占锁只允许在同一时间由一个线程读取数据,其他线程必须等待当前线程释放锁才能进行读取。
3. 共享锁是一种乐观锁,它放宽了加锁的条件,允许多个线程同时进行读操作。
通过上述相信大家对Java多线程锁已经有所了解,如果想了解更多相关信息,可以到极悦官网中的技术文档中进行极悦在线学习。
你适合学Java吗?4大专业测评方法
代码逻辑 吸收能力 技术学习能力 综合素质
先测评确定适合在学习