暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Java锁之公平(非公平)锁

产教Code 2019-10-16
192
  1. 什么是线程

用户每启动一个进程,操作系统就会为该进程分配一个独立的内存空间。

线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,

只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),

但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.

一个线程可以创建和撤销另一个线程;

  1.2 多线程:

同一个进程中的多个线程之间可以并发执行!

2.线程的五种状态

  a、新建状态(new)

  b、就绪状态(Runnable)

  c、运行状态(Running)

  d、阻塞状态(Blocked)

  e、死亡状态(Dead)

3.多线程同时访问同一个对象有时会抛出拒绝访问异常

如果使用synchronized去访问可以解决这个问题但是在

某种特别情况(比如位置信息保存到数据库里)就产生高并发,导致大量重复数据被写入数据库

那么怎么保证数据的唯一性要怎么解决呢

先讲原因  举个简单的例子

在for(1-10)循环里面创建一个新线程并实现run()我们需要的是1-10有序的排列下来

可是结果却不是


4.针对这个问题我查询资料了解到“锁”来控制

所谓的锁分为公平锁和非公平锁

在这里把线程比作人来说,不加锁的话就相当于一群人在食堂抢饭无序而混乱

非公平锁呢就是所有的线程开始排队一次只有一个线程执行,其余线程等待该线程完成后在一起抢夺第二个打饭的机会

公平锁呢就是所有线程开始排队先1号然后2号有序

简称来说呢就是非公平锁抢夺对对象的使用权

公平锁安线程排序,排序使用对象;

5.synchronized 和  Lock

synchronized就是非公平锁(可重入锁-递归锁)

在这里给大家举例一个Lock就是公平锁(可重入锁-递归锁)

创建Lock lock = new ReentrantLock(true);//公平锁

使用Lock的时候需要先打开锁然后在try catch finaly 我们需要在finaly里面手动释放锁

6.关于java锁还有很多包括

可重入锁   独享锁/共享锁  互斥锁/读写锁  乐观锁/悲观锁   分段锁   偏向锁/轻量级锁/重量级锁     自旋锁

有兴趣的同学可以私下查询-----听说面试官对java锁也很感兴趣哦.


文章转载自产教Code,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论