
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
对于程序员来说,软件安全问题是软件开发项目中的一个核心问题,而我们今天就一起来了解一下,软件安全中锁对线程安全的重要性。
一、程序安全
线程安全是程序开发中非常需要我们注意的一环,当程序存在并发的可能时,如果我们不做特殊的处理,很容易就出现数据不一致的情况。
通常情况下,我们可以用加锁的方式来保证线程安全,通过对共享资源(也就是要读取的数据)的加上"隔离的锁",使得多个线程执行的时候也不会互相影响,而悲观锁和*乐观锁*正是并发控制中较为常用的技术手段。
二、悲观锁
悲观锁就好像一个有迫害妄想症的患者,总是假设坏的情况,每次拿数据的时候都以为别人会修改,所以每次拿数据的时候都会上锁,直到整个数据处理过程结束,其他的线程如果要拿数据就必须等当前的锁被释放后才能操作。
使用案例
悲观锁的使用场景并不少见,数据库很多地方就用到了这种锁机制,比如行锁,表锁,读锁,写锁等,都是在做操作之前先上锁,悲观锁的实现往往依靠数据库本身的锁功能实现。Java程序中的Synchronized和ReentrantLock等实现的锁也均为悲观锁。
三、乐观锁
乐观锁的思想和悲观锁相反,总是假设好的情况,认为别人都是友好的,所以每次获取数据的时候不会上锁,但更新数据那一刻会判断数据是否被更新过了,如果数据的值跟自己预期一样的话,那么就可以正常更新数据。
场景
这种思想应用到实际场景的话,可以用版本号机制和CAS算法实现。
CAS
CAS是一种无锁的思想,它假设线程对资源的访问是没有冲突的,同时所有的线程执行都不需要等待,可以持续执行。如果遇到冲突的话,就使用一种叫做CAS(比较交换)的技术来鉴别线程冲突,如果检测到冲突发生,就重试当前操作到没有冲突为止。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请在707945861群中学习了解。