For investors
股价:
5.36 美元 %For investors
股价:
5.36 美元 %认真做教育 专心促就业
随着互联网的不断发展,越来越多的人都在学习Java编程开发等达内的不同课程体系,今天我们就通过案例分析来简单了解一下,Java编程锁的类型与优化方法。
共享锁和排它锁(ReentrantReadWriteLock)
排他锁,又称为独占锁、独享锁
共享锁,又称为读锁,获得共享锁之后,可以查看但无法修改和删除数据,其他线程此时也可以获取到共享锁,也可以查看但无法修改和删除数据
共享锁和排它锁的是读写锁ReentrantReadWriteLock,其他读锁是共享锁,写锁是独享锁。
读写锁的规则
多个线程只申请读锁,都可以申请到
如果有一个线程已经占用了读锁,则此时其他线程如果要申请写锁,则申请写锁的线程会一直等待释放读锁。
如果有一个线程已经占用了写锁,则此时其他线程如果要申请写锁或者读锁,则申请写锁的线程会一直等待释放写锁。
要么是一个或多个线程同时拥有读锁,要么是一个线程拥有写锁。
加读锁的作用就是为了保证并发安全,虽然看上去不加锁也可以读取,但是如果我们加了锁之后,就可以防止读写同时发生的情况发生,一旦我们在读取该值之前率先加锁,那么如果有其他线程想在我们读取期间修改该值的话,他是无法做到的,因为他无法在我们读取期间获取写锁。
自旋锁和阻塞锁
自旋锁:当前线程在不放弃CPU的情况下,不断地去尝试获取锁,当持有锁的线程释放掉锁之后,这样当前线程就不会陷入堵塞而是直接获取资源,从而避免线程切换的开销。适合于并发度不是特别高的情况下。
堵塞锁:如果当前线程没有拿到锁,就直接陷入堵塞状态。
可中断锁(可以响应的锁)
synchronized就不是可中断锁,而Lock是可中断锁。因为在tryLock(time)和lockInterruptibly都能响应中断。
即当某一线程A正在执行锁中的代码,另一线程B正在等待获取该锁,那么在这等待期间线程B是可以被中断的。
锁的优化
缩小同步代码块
减少请求锁的次数。(可以把多个请求封装成一个去统一请求)
锁中尽量不要再包含锁。(容易造成死锁)
选择合适的锁类型或者锁工具类。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。