Java中的锁

本篇比较硬核,请谨慎观看 !!! 小朋友一定要带上父母才能看哟

  Java中的锁用来保护共享变量,实现对共享变量的互斥访问,即同一时间只能有一个线程访问该共享变量。
  Java程序天生就是多线程的,在实际编程中,多个线程协同工作更是常事,在这种情况下,对多线程共享的变量的保护便成了一件很重要的事。
  本文先谈笔者对锁的理解,之后再简要介绍一下Java种的各种锁。

锁是什么

  在我看来,锁是一种实现对共享变量进行互斥访问的一种机制。共享变量指多个线程共同访问的变量,在计算机中的表现就是内存地址相同的变量,Java 中可以简单地通过类的静态变量、单例对象或同一对象的引用来实现变量共享。
  至于为什么要做互斥访问,答案很简单,为了保证程序逻辑的正确,或者说一致性。现代CPU上有多个core,每个core都可以执行单独的线程,所以一个Java程序里的多个线程完全可能同时被调度到不同core上同时执行,再加上操作系统对线程的切换是不可预知的,任何时刻,任何一条指令执行完后都可能发生线程切换,所以程序代码可能停在任何一个地方。以 i++ 为例,CPU保证将变量 i 读入CPU这一过程是原子的(一条指令),执行 i 自增这一过程也是原子的(即不可能在这一过程中发生线程的切换),但是它无法保证这两个操作在一起执行时也是原子的,也就是说,在把 i 加载进 CPU 后,OS有可能会调度走这个线程,剥夺它的执行权,然后另一个线程执行,从内存中读取 i,之后把 i 加 1,写回内存。操作系统再调度到上一个线程,继续执行加 1 操作时,i 的值已经发生了变化,但是这个线程并不知道这种变化,于是它就在原来的基础上执行了自增操作,这就会产生不一致状态,因为我们使用多线程时希望获得与单线程程序相同的执行结果,执行两次自增操作后,i 的值要比原来大2,而不是大 1。
  对于这种错误,计算机学科的通用解决方案是对 i 进行互斥访问,同一时间只让一个线程访问这个变量。具体的实现方案就是在访问共享变量前要首先拿到对这个变量的唯一访问权,后续想要获得访问权的线程阻塞在这里,在访问后再释放对它的唯一访问权,允

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值