首页
学习
活动
专区
工具
TVP
发布

直击春招00-多线程

讲一下Java中的乐观锁和悲观锁

悲观锁:每次都会假设自己操作资源的时候别人会修改,所以在获取数据之前会加一个锁,直到操作完成才释放锁,在有锁时别人如果想操作这个资源就只能阻塞直到获得锁。

数据库中的读锁、写锁、行锁以及java中synchronized和Lock的实现类使用的是悲观锁。悲观锁适合写操作多,冲突几率大的场合;悲观锁的缺陷在于如果当前线程没有获得锁那么就会被挂起进入阻塞队列,而后通过抢占获得锁时进入就绪转态,这个过程需要很大的开销

乐观锁:乐观地认为自己在操作时别人不会操作,所以就不会加锁,只是在最后提交更新的时候检查一下数据是否被更改了,如果数据被别人改了那么我就重新再操作一遍。乐观锁不会产生死锁问题。

乐观锁一般用CAS(compare and swap)或者版本号机制实现。CAS算法的实现主要涉及三个操作数,内存中的值(V),旧的预期值(A),要修改的值(B),如果我们要修改内存中的值,就要先比较V和A的值,如果他们相等就把内存中的值改成B,否则什么都不做。这种做法可能会出现ABA问题,就引入了版本号机制,每次修改数据后都将版本号加一,如果这次修改前记录的版本号和修改时读到的版本号不一致,就不进行修改。

进程线程状态转换,进程线程区别

线程是操作系统能够调度的最小单位,一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。线程的五个状态是新建状态,就绪状态,运行状态,阻塞和死亡状态

新建转态:当用new操作符创建一个线程时,例如new Thread(r),线程还没有开始运行

就绪状态:当线程对象调用start()方法即启动了线程,start()方法创建线程运行的系统资源,并调度线程运行run()方法。当start()方法返回后,线程就处于就绪状态

运行状态:当线程获得CPU时间后,它才进入运行状态,真正开始执行run()方法

阻塞状态:阻塞状态是正在运行的线程没有运行结束,暂时让出CPU。除了图中的两种方法外,还有调用join()或者I/O请求超时都会进入阻塞状态

死亡状态:退出了run方法或者遇到没有捕获的异常

进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位。一般来说,进程有三个状态,即就绪状态,运行状态,阻塞状态。

运行态:进程占用CPU,并在CPU上运行;

就绪态:进程已经具备运行条件,但是CPU还没有分配过来;

阻塞态:进程因等待某件事发生而暂时不能运行;

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181225G1HZVG00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券