范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

互联网面试Java中的锁都有哪些?

  在平时工作开发中难免会被多线程操作共享资源相关的问题所困扰,这个时候我们一般来解决这个问题的方式就是通过锁机制来保证线程操作的安全性。在Java中我们经常使用到的锁就是Synchroinzed,JVM的关键字,它是依赖于JVM系统调用来实现锁操作。ReentrantLock,是在Java并发包下的基于AQS实现的一种可重入锁机制,其原理就是采用CAS来修改一个被volatile关键字修饰的int类型数据来标识对象是否获取到了锁,如果state变量值不为零则证明当前有线程正在使用该锁。
  关于锁的概念,其实并不是Java独有的概念,在很多的场景中都会有多线程访问共享的资源的操作,我们可以根据不同的规则将锁进行分类。下面我们就来谈谈在Java中的锁的规则与分类都有哪些?根据是否有对其他线程操作有影响来划分
  乐观锁
  所谓的乐观锁就是默认认为在当前线程去修改数据的情况下,不会有其他线程来进行数据的修改,也就是说在数据的操作过程中是不需要对其进行加锁的。CAS(比较并交换)是乐观锁的最佳实践,也就是需要比较内存中的实际值与期待得到的值是否相同,如果相同了才会更新,其底层实现是利用cmpxchg指令来实现。有兴趣的读者可以研究一下CPU中的cmpxchg指令。
  悲观锁
  顾名思义,也就是默认会认为在当前线程修改数据的时候,一定会有其他的线程对数据进行修改,也就是说在操作共享数据之前必须要对所要操作的数据先进行加锁操作。在Java中的Synchroinzed和ReentrantLock都是悲观锁的实现。根据对获取不到锁的线程的处理情况来划分
  轻量级锁
  所谓的轻量级锁是指如果当前锁已经被某个线程所持有了,如果当前线程获取不到锁的时候,那么就会自旋等待,等到锁释放之后在进行获取当前锁。也就是说在获取到锁之前,线程一直是处于自旋等待。
  重量级锁
  而所谓的重量级锁是指,如果锁被某个线程持有了,当前线程如果获取不到锁,就会将当前线程挂起来等待锁的释放,或者是线程被唤醒的过程。
  从这里可以看出如果使用了重量级锁那么一个线程在获取不到锁的时候就会挂起等待,而这个过程需要进行CPU的线程上下文切换,而这个切换时间远远大于用户执行代码本身的时间,所以对于一般耗时较短的任务可以采用轻量级锁来让线程进行自旋等待,会省去了不少上下文切换的时间。
  从上面的描述中我们也知道,如果使用了轻量级锁,在整个线程持有锁的执行过程中,如果线程自旋等待的时间太长,就会导致资源的浪费,这样就引入了一个概念,就是锁升级,锁粗化,这些操作都是用来对锁进行优化的。一般来讲锁升级是从无锁到偏向锁,再到轻量级锁,再到重量级锁。每个过程都是结合实际来对锁进行处理,有效的解决了因为锁使用不当带来的系统资源消耗等问题。
  上面所提到的无锁,就是不加锁,共享资源被所有线程共同访问,一般来讲CAS的方式就是一种无锁实现。
  偏向锁则是指如果当前线程获取到了锁,在执行过程中也没有其他线程来与之竞争锁,那么这个锁就会偏向于当前持有线程的获取,在当前线程再次执行的时候就不需要在进行获取锁的操作了,这样做的好处就是再一定程度上减少了获取锁所带来的线程开销。
  在之前的分享中我们介绍过关于Synchroinzed的相关原理,有兴趣的读者可以到合集中去查看。根据线程竞争锁获取规则的设计来进行划分
  公平锁
  公平锁,是指如果当前线程已经获取到了锁,并且还未完成操作,其他线程如果想要获取到该锁,那么就必须排队等待。
  非公平锁
  非公平锁,是指如果当前线程已经获取到锁除了,那么新的线程如果想要获取到锁,那么就需要通过CAS操作来抢一下锁,如果抢到了,就执行逻辑,如果抢不到了再去排队等待执行。
  在JDK中对于ReentrantLock的操作就是支持公平与非公平的,默认情况下是非公平的。代码如下  /**      * Sync object for non-fair locks      */     static final class NonfairSync extends Sync {         private static final long serialVersionUID = 7316153563782823691L;          /**          * Performs lock.  Try immediate barge, backing up to normal          * acquire on failure.          */         final void lock() {             if (compareAndSetState(0, 1))                 setExclusiveOwnerThread(Thread.currentThread());             else                 acquire(1);         }          protected final boolean tryAcquire(int acquires) {             return nonfairTryAcquire(acquires);         }     }
  如果线程想要获取到锁,那么需要去修改private volatile int state,对应的值。也就是通过compareAndSetState(0, 1)方法来抢一下锁,然后通过setExclusiveOwnerThread(Thread.currentThread()),操作来执行锁如果抢不到则执行acquire(1)操作。
  公平锁的实现代码如下。在获取锁的时候就只进行了acquire(1)操作。    /**      * Sync object for fair locks      */     static final class FairSync extends Sync {         private static final long serialVersionUID = -3000897897090466540L;          final void lock() {             acquire(1);         }          /**          * Fair version of tryAcquire.  Don"t grant access unless          * recursive call or no waiters or is first.          */         protected final boolean tryAcquire(int acquires) {             final Thread current = Thread.currentThread();             int c = getState();             if (c == 0) {                 if (!hasQueuedPredecessors() &&                     compareAndSetState(0, acquires)) {                     setExclusiveOwnerThread(current);                     return true;                 }             }             else if (current == getExclusiveOwnerThread()) {                 int nextc = c + acquires;                 if (nextc < 0)                     throw new Error("Maximum lock count exceeded");                 setState(nextc);                 return true;             }             return false;         }     }锁重入机制
  重入锁和非重入锁
  所谓的重入锁,就是当前线程获取到锁的时候,如果这个线程再次进入获取锁的时候可以直接进入而不需要重新获取锁的操作。在Java中的Synchroinzed和ReentrantLock都是可重入锁。而非重入顾名思义就是当前线程如果再次执行同步代码块的时候还需要再次等待获取锁。锁共享机制
  独占锁和共享锁
  独占锁的概念就是说如果有一个线程获取到锁,那么其他线程则不能继续获取该锁,也就是说这个锁是对于这个线程来讲是独有的。
  共享锁则是指一个锁可以有多个线程来共同获取,也就是一个线程获取到该锁之后,其他线程还可以继续获取到该锁。
  上面我们提到的基于AQS实现的ReentrantLock就是独占锁。而AQS也是提供了共享锁的操作方案tryAcquireShared,Semaphore就是通过tryAcquireShared来实现的共享操作。
  图片来源网格

名家提点曼城多特蒙德或默契言和欧冠小组赛已经打完四轮比赛了,提前出线的球队已经不在少数,这其中就包括瓜迪奥拉的曼城。蓝月亮以10分排名小组第一,但尚未锁定第一名的资格,本场做客对阵7分的多特蒙德,曼城只需要一场西铁城在欧洲推出一款,使用无线电遥控的手表首次在欧洲市场推出的这款手表有着电波表加光动能技术在欧洲叫无线电遥控手表。CB594它有着万年历世界时间功能和自动校正功能。最重要的是,这款时尚的腕表拥有着这家日本巨头的核心专利技来袭!足球赛事情报分享1。法甲不幸,布雷斯特中场核心孩子夭折布雷斯特中场主力前腰里斯米卢(9场2球)最近遭遇不幸,他与妻子的新女儿罗米因心脏问题,刚刚出生就不幸离开了人世。而米卢在社交媒体上表示,他需要你怎么花时间,就过怎样的人生所谓日子,是日历撕了再翻,旧了又换。一翻一换中,时光携风熙攘而过,完成了它的生命轨迹。我们裹挟其中,有时活得热闹张扬。笑声肆意,走路带风,组一场又一场的聚会,迎一张又一张的笑脸,不江西女婴被加拿大人领养,20年后成奥运冠军我不会去找亲生父母2021年7月26日东京奥运会,在100米蝶泳的决赛中,一名加拿大女选手战胜了中国的夺冠大热门张雨霏,拿到了加拿大首枚金牌。这名加拿大女选手名叫玛吉麦克尼尔,年仅21岁。如此年轻却被亲弟弟半夜摸胸,父母的回答,揭开了性教育最不堪的一幕这两天,在业主群里发生这样一件事一位56岁大的小男孩在电梯里掀陌生女孩的裙子。女孩有点生气,当场要男孩奶奶教育自己的孙子。结果奶奶却一脸无所谓,不责骂也不教育孩子年纪小,不懂事,你不要让奶茶毁掉你的孩子宜春电视台报道,14岁的小沈在父母的陪伴下到医院急诊发现腹腔内有大量的颗粒状阴影,而这些颗粒状阴影正是所谓的珍珠奶茶里面的珍珠。原来最近几天小沈每天都要喝一杯珍珠奶茶,这种珍珠是用给孩子一个完整的中国地图你们给孩子买的地图或者地图爱好者买的地图是什么样的?横版中国地图横版中国地图2是以上这样的吧?还有大多数家庭标配是中华人民共和国地图和世界地图家庭标配版地图这样的中国地图你觉得是对孩子的智慧,主要是在家里形成的家里有人,家里有事,家里有东西(物)。一个人能学着和家里人处理好关系,能把家里的事情安排妥当,能把家里的东西都认识了,知道它们的来龙去脉,我想也就基本认识了这个世界。因为外部世界也为何身边的梗越来越多,脑梗怎么进行调理?发表在NEJM上的一项基于GBD2016的数据显示,从1990年到2016年期间,全世界成年人患脑梗的概率有24。9,中国位居榜首,卒中风险达到了40。而且我国脑卒中发病率一直呈现荣耀30Pro对比华为Mate30如何?买二手选哪款更好?前一段时间笔者出于好奇,在网上淘了一款荣耀30Pro来体验了一下,入手的价格是3600左右,我看到网友在那篇体验文后面留言说这款手机还不如华为Mate30,所以本文就来跟大家讨论一
中概股美国撤退,统一大业不远了?8月12日下午,中国人寿中国石化中国石油中国铝业上海石油化工股份等多家公司宣布将从纽交所退市。无独有偶,上周五,阿里巴巴被美国证券交易委员会(SEC)列入预摘牌名单,面临退市的风险中概股退市,如何理解?这几点你要想到中国概念股,是投资者对所有在海外上市的中国股票的统称。这些在海外上市公司的主要资产或主要业务集中在中国内地境内的一个或多个子公司。上世纪90年代以来的20多年间,中概股已积聚了一批守望怒进畅销榜前五,监测站礼包销量竟然如此惊人?根据守望先锋的最新消息,由于监测站礼包近来的售卖数据惊人,守望在畅销榜上的数据直接飞跃进前五,呈现出了非常漂亮的涨势。这无疑让早早唱衰守望先锋归来的人大大打脸。然而事实上守望归来的洗浴中心有何猫腻?为何有人放弃酒店,再晚也要在此过夜在晚上预订洗浴中心,能享受哪些特殊服务?(此处已添加小程序,请到今日头条客户端查看)为何男游客放弃入住酒店,反而去洗浴中心过夜呢?首先,在半夜预订酒店不确定因素很多,之前小编外出旅为什么酒店的床上要放4个枕头呢?建议了解旅游越来越受人们的欢迎,越来越多人开始加入到旅游的行列当中,在旅游时最重要的一件事情就是,提前定一个舒适的酒店,毕竟我们无法在家居住。所以就要在外预订酒店,这样出去玩了一天之后,来自驾出行,首选GL8ES长途自驾游开什么车好?说到真正意义上的长途自驾游,应该是规划出行三天以上,目标距离2000公里以上,那种自驾游需要你做路书,看攻略,带行李,定日子出门的。事无巨细,全方面考虑。首要峨眉山频繁上演人猴大战,猴王被击毙,为何猴子会攻击游客?被击毙的猴王峨眉山的猴子有多野?下至向游客讨要食物,上至插科打诨殴打游客。请注意,最严重的情况的下猴群是真的会殴打游客,如果与猴群发生冲突,恰巧猴王也在,那么人猴之间必然会发生冲突印度男子自制小飞机带全家人畅游欧洲海外奇遇见闻录第五期一名居住在英国的印度男子打造了一架4人座的小飞机,并驾驶它载着妻子和两个女儿到欧洲各地旅行。据印度时报电视台(TimesNow)7月26日报导,塔玛拉克山(As立秋就要到啦,9。9元游高颜值的前小桔创意农场高温之下的8月,实际要进入立秋啦夏末初秋的天气,云也特别大朵快来高颜值的前小桔农场畅享户外好风光吧跟随入长兴岛的落雨杉夹道一路前往市中心出发1小时左右的车程后抵达长兴郊野公园旁的前这个夏天邂逅多样的窑湾有青葱绿径的舒坦有河岸水系的清凉有船来船往的惬意有古街旧巷的安然有古墙黛瓦间的文化内涵有灯火阑珊处的浪漫柔情有枕水而眠的古朴雅致有夜猫子市集的人间烟火有水上演出的文艺气息这样的窑湾四个技巧打造稻田旅游合理利用基本农田一般农田大家都知道基本农田和一般农田不能非农化和非粮化,那么如何打造既合法又网红的景观呢?教给大家四个技巧一起来看看吧1用农作物种出来的景观,比如稻田艺术画等2用防腐木做观光栈道,可以让有