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

互联网面试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来实现的共享操作。
  图片来源网格

胡鑫宇,致远中学,录音笔,饭卡,缢吊,失踪,背后的一点思考胡鑫宇事件想必大家都已经知道的很详细了,无论是警方的官方通报,还是广大网友的爆料,都告诉了大家一个谁也不愿意看到的最令人伤心的结果。当一切尘埃落定的时候,人们才会发现,无论遇到怎样时光不老我们不散时光不老我们不散今天是一个特殊的日子,因为今天是清晨寄语两周年的纪念日。去年清晨寄语一周年的纪念日那晚的直播,相信很多家人还记忆犹新,历历在目。然而这一年历经了太多的变化,可无论怎是应该先知道死后知道生,还是先知道生才去想死亲爱的读者朋友,今天的这篇文章里,我们同样是分享生与死的先后问题。其实这个问题我看在之前的文章生与死的先后顺序里已经分享过。不过,路大哥心里觉得不够,于是愿在这篇文章里,通过生活中孕妇多吃酸食好处多推荐适合孕妇吃的酸食怀孕是女性特别重视的一个阶段。孕妇的饮食不只是一个人的事。孕妇的饮食直接关系到孩子的身心健康。所以,想要自己的幸福生活更有保障,我们当然不会错过这么好的选择。孕妇吃酸的食物有什么好逆市飘红,来自珠海的房企在成都市场表现如何?2022年,房地产行业集体承压。放眼全国,一年内就有正荣禹洲大发世茂融创绿地阳光城等房企先后宣布债务违约暴雷,全国房地产数据的销售总量持续探底,千亿房企阵营减员23家,据第三方数据文化旅游雪映丹霞别样美雪映丹霞别样美雪后的平山湖大峡谷吸引游人前来色彩绚丽的峡谷舒眉雪落无声。甚至,无形。似有若无,只感觉润湿扑面,沁人心脾,定睛凝神,却无踪影,如雾,只在远处氤氲。似霞,早已融入呼吸。文化旅游走进敦煌雅丹地貌来源新甘肃走进敦煌雅丹地貌敦煌雅丹国家地质公园平山湖大峡谷(本文图片均为资料图)朱越中国大西北那片辽阔的疆域,有着恢宏磅礴的地貌无穷变幻的地形峥嵘万状的形态奇幻瑰丽的色彩,高山峡谷文旅部推出全国乡村旅游精品线路,灵丘红古绿三色之旅入选!黄河新闻网大同讯(记者魏悦)日前,文化和旅游部推出乡村四时好风光瑞雪红梅欢喜过年全国乡村旅游精品线路128条,山西有7条线路入选,大同市灵丘红古绿三色之旅榜上有名。灵丘红古绿三色之小红书发布2023春节消费报告旅游成95后过年热选,春运宠物回乡成热潮2023年春节,讲述着关于复苏的故事。2月1日,小红书与数据分析机构易观分析联合发布小红书2023春节消费报告。报告显示流动成为年轻人的关键词,他们或奔赴山海游玩,或托运宠物一起回宝山有个地方蕰藻浜篇宝山,自古人文荟萃,人杰地灵。作为一个忙碌的都市人,我们每天行色匆匆,路过一条条街道,一栋栋楼房或许您会留意到有些路名似曾相识,或是觉得某栋建筑别具风采,但您也许没有时间停下脚步,游客在大理吃饭,每个菜尝两口觉得难吃,要求店家退一半餐费!店家懵了头一次遇到这事近日,网友夏主编旅游攻略到云南大理旅游,遭遇了这么一场尴尬事就餐时觉得菜品不好,想退掉几道未动过的菜肴,却被饭店老板拒绝。我在云南最憋屈的一次旅行经历,遭网友痛骂,被商家欺坑,连投
沙奎尔奥尼尔NBA内线无解大鲨鱼,联盟篮板质检员!他是NBA历史上最强的内线杀器,他能让联盟为之改变规则的男人,他有着上天都眼红的超级天赋。一言不合就直接隔扣,篮板看到他都为之发抖。他是力量的化身他是篮下无解的难题,他是魔术的状元父亲的小木箱小时候住在偏僻乡下。课业较少,闲暇太多,没有电视手机可以消遣。除了在大自然中摸爬滚打地自由玩耍,便是父亲塞在床底下木箱中的宝物一一书了。那时候父亲每从田间回家,倒一大缸粗茶,提了椅成为网红城市的敦煌,还有这些面图为敦煌市莫高镇农民在采摘葡萄。(资料图)张晓亮摄中新网兰州12月17日电(刘潇)提起敦煌你能想到什么呢?是见证了不同文明对话和交流的莫高窟,是以沙动成响而得名的鸣沙山,还是驻守大梦究竟是不是反的?人可以控梦吗?(欢迎阅读)在头条看见彼此说到做梦,相信很多人小时候都有这样的经历做了噩梦害怕的时候,父母们会常安慰说没关系,梦都是反的,一定不会发生这样的事情。或者老年人会一本正经的让你破口大骂,说是可以驱惊人的苦难守恒定律,读懂改变一生!学而不思则罔,思而不学则殆。吃苦,正在变成一件奢侈的事情。很久之前,苦与穷是紧密联系在一起的,穷人面临得是必须要吃苦,富人则是安逸享乐。如今,随着时代的发展,穷人早已不需要吃苦,每倘若那晚没有胡来,林丹也不会陷入如此尴尬境遇,进退两难几天前,张嘉倪的丈夫买超,带着在校女大学生夜宿酒店的消息,在网络上闹得沸沸扬扬。过往的再多主动和深情,似乎都架不住一颗躁动不安分的心。而买超说过的只有丧偶,没有离婚的誓言,如今也成19岁少年和寡妇私定终身,56年徒手凿出爱情天梯,现代版神雕侠侣重庆19岁少年,带着大10岁的寡妇私奔,两人躲进无人森林56年。这期间,小伙为妻子徒手凿出6208级天梯,在1500米高海拔的山坡上建造了自己的爱情桃花源,这段曾经今不被世人接纳的美杜莎女王分明保护了萧炎,为何药老却说她违约?哈喽,大家好,我是心尘,日常带你从不同的角度看国产动漫。斗破年番第23集所带来的话题不可谓不少,萧薰儿优化后的形象再次惹来争议,由原先的束发改为了散发,脸型在一些细节上也做了轻微的聪明狗狗会帮助主人照看刚出生的婴儿据英国都市报报道,美国有一只叫做Lucy的狗狗聪明异常,甚至还会帮着主人带娃。Lucy是一只拉布拉多犬和哈士奇混血犬,它不仅会取尿布和奶瓶,收拾玩具,甚至会在宝宝哭闹的时候去叫醒主NBA西部排名榜掘金错失第2,勇士跌出前10,仅领先湖人1个胜场12月17日,东西部10场常规赛结束后,西部排名榜再次大乱掘金爆冷不敌湖人,错失第2名小黑马国王2连胜,重回前5名残阵勇士不敌76人,跌出前10名,仅领先湖人1个胜场差。1。西部排5换2!热火报价大帝恩比德,筹码诚意十足上赛季还是东区第一的热火队,本赛季打得十分的挣扎。核心主力巴特勒阿德巴约泰勒。希罗洛瑞陆陆续续受伤缺席,他们一度只能以8人征战客场,球队排名也一度掉到了东部第13名。但现在随着伤病