这将是一个系列我将重以下几个点进行讲解
一、Java自身提供的锁,synchronized、aqs、cas、偏向锁、自旋锁
二、分布式锁
三、数据库innodb锁
1、为什么会有锁,我们为什么要用锁
硬件层面
在计算机行业有一个定律,"摩尔定律"(集成电路的集成度每18个月翻一倍,或者相同性能的计算机产品每18个月价格降一倍,比尔盖茨曾经开玩笑说,如果汽车行业也像计算机行业,那么现在1L油能开1800km,哈哈哈),在此定律下,计算机的性能突飞猛进,而且价格也随之越来越便宜,cpu从单核到了多核,缓存性能也得到了很大提升,尤其是多核cpu技术的到来,如下图所示为2个2核cpu组成一个系统cpu,在这种4核的机器上,计算机同一时刻可以处理4个任务。
所以在这种cpu的架构下,在执行一个任务的时候就可以引入多线程模型进行编程,如果依旧是单线程编程,那么在执行任务的那一时刻将会浪费其他3核的资源,如果现在是100核的计算机,那将浪费99%的资源,但是引入多线程编程,将会带来数据不一致问题,简单来说如上图所示,core 0 核core 1 同时执行一段i++语句,将会引入数据不一致问题,这种情况下就需要锁来解决这个数据不一致,也就是顺序问题。
软件层面
在软件方面主要原因就是有了操作系统这个软件的出现,在操作系统出现之前,计算机只能串行的执行任务,即A任务执行完启动B任务,而操作系统的出现使得计算机每次可以同时计算多个任务,这才有了上面的多线程执行任务,在这点可以看出,cpu从单核到多核的设计和操作系统的出现使计算机可以同时运行多个任务相得益彰。
在软件层面设计计算机同时运行多个任务有以下三点原因:
1、提高资源利用率
其实很多时候程序在运行的时候是在等待,比如io、网络,设计程多个任务同时执行,当一个任务在等待io、网络等的时候,就可以把他占用的cpu资源切换出来用来执行其他任务,如果操作系统同时只能执行一个任务,那么他就必须同步等待,浪费资源。
2.公平性
如果是操作系统设计为单线程,其实上面的任务就是不公平的,你要设计好他的先后顺序,比如你要听音乐任务和上QQ聊天任务这两个任务你就要选择先干什么后干什么,这样及其不方便,如果设计为多任务执行,不同程序,不同用户对计算机资源有着同等使用权。没有谁先谁后,不需要考虑优先级。
3、便利性
一种情况就是公平性中所讲的听音乐任务和上QQ聊天任务,可以同时进行,方便了,另一种情况把一个计算n个任务的程序拆分成n个程序,每个程序执行一个任务,后者比前者编程简单便利
所以在软硬件的相互配合与高度支持下java多线程编程已成为必然的趋势,然而多线程编程就会引入数据安全性问题,从而引入了锁来解决。
领取专属 10元无门槛券
私享最新 技术干货