游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

保证线程安全的几个小技巧

  前言
  在软件编程中,多线程是个绕不开的话题。多线程的使用,能够提高程序的运行效率,但也带来新的问题:如何保证下面的线程安全呢?
  无状态
  例如:
  publicclassTest{
  publicvoidthreadMethod(intj){
  inti1;
  jji;
  }
  这个例子中,不存在全局变量,所以不存在线程安全问题。
  官方解释:局部变量作用域仅限于函数内部,离开该函数的内部就是无效的。不可变
  例如:
  publicclassTest{
  publicstaticfinalStringDEFAULTNAMEabc;
  }
  这个例子中,全局变量被final修饰,所以不存在线程安全问题。
  官方解释:final被修饰的变量为常量一旦赋值不能修改,被修改的方法为最终方法不能被重写,被修饰的类是最终类,不能被继承。无修改权限
  例如:
  publicclassTest{
  privateStringname;
  publicStringgetName(){
  returnname;
  }
  }
  这个例子中,没有对外暴露修改name字段的入口,所以不存在线程安全问题。
  官方解释:public表示共有:类的数据成员和函数可以被该类对象和派生类访问。private私有型:自己的类可以访问,但派生类不能访问。protected保护型:自身类和派生类可以访问相当于自身的private型成员,它同private的区别就是在对待派生类的区别上。synchronized
  例如:
  publicclassTest{
  privateintage18;
  publicsynchronizedintgetAge1(inti){
  ageagei;
  returnage;
  }
  publicintgetAge2(inti){
  synchronized(this){
  ageagei;
  }
  returnage;
  }
  publicintgetAge3(inti){
  synchronized(Test。class){
  ageagei;
  }
  returnage;
  }
  }这个例子中,使用到了synchronized关键字,所以不存在线程安全问题。
  官方解释:Synchronized可保证同一时刻有且只有一条线程在操作共享数据,其他线程必须等待该线程处理完数据后再对共享数据进行操作。
  注意:使用synchronized修饰非静态方法或者使用synchronized修饰代码块时指定的为实例对象时,同一个类的不同对象拥有自己的锁,因此不会相互阻塞。使用synchronized修饰类和对象时,由于类对象和实例对象分别拥有自己的监视器锁,因此不会相互阻塞。使用synchronized修饰实例对象时,如果一个线程正在访问实例对象的一个synchronized方法时,其它线程不仅不能访问该synchronized方法,该对象的其它synchronized方法也不能访问,因为一个对象只有一个监视器锁对象,但是其它线程可以访问该对象的非synchronized方法。线程A访问实例对象的非staticsynchronized方法时,线程B也可以同时访问实例对象的staticsynchronized方法,因为前者获取的是实例对象的监视器锁,而后者获取的是类对象的监视器锁,两者不存在互斥关系。Lock
  例如:
  publicclassTest{
  privateReentrantLockreentrantLocknewReentrantLock();
  privateintage18;
  publicsynchronizedintgetAge(inti){
  try{
  reentrantLock。lock();
  ageagei;
  }catch(Exceptione){
  e。printStackTrace();
  }finally{
  reentrantLock。unlock();
  }
  returnage;
  }
  }
  这个例子中,使用到了ReentrantLock锁,所以不存在线程安全问题。
  Lock不是Java语言内置的,synchronized是Java语言的关键字,因此是内置特性。Lock是一个类,通过这个类可以实现同步访问。
  Lock和synchronized有一点非常大的不同,采用synchronized不需要用户去手动释放锁,当synchronized方法或者synchronized代码块执行完之后,系统会自动让线程释放对锁的占用;而Lock则必须要用户去手动释放锁,如果没有主动释放锁,就有可能导致出现死锁现象。分布式锁
  publicclassTest{
  privateStringRedisTemplateredisTemplate;
  privateintage18;
  publicsynchronizedintgetAge(inti){
  StringuuidUUID。randomUUID()。toString();
  BooleanlockredisTemplate。opsForValue()。setIfAbsent(lock,uuid,300,TimeUnit。SECONDS);
  if(lock){
  ageagei;
  }else{
  getAge(i);模拟自旋
  }
  returnage;
  }
  }这个例子中,使用到了rerdis的setnx分布式锁,所以不存在线程安全问题。
  如果你对redis分布式锁的用法和常见的坑,比较感兴趣的话,可以看看我的另一篇文章Redis缓存失效问题:缓存穿透缓存雪崩缓存击穿,有对分布式锁相关介绍说明volatile
  例如:
  publicclassTest{
  privatevolatilebooleanrunningfalse;
  privateThreadthread;
  publicvoidhandle(){
  连接canal
  while(running){
  业务处理
  }
  }
  publicvoidstart(){
  threadnewThread(this::handle,name);
  runningtrue;
  thread。start();
  }
  publicvoidstop(){
  if(!running){
  return;
  }
  runningfalse;
  }
  }这个例子中,全局变量使用volatile关键字,所以不存在线程安全问题。
  官方解释:volatile是Java虚拟机提供的轻量级的同步机制,是基本上遵守了JMM的规范,主要是保证可见性和禁止指令重排,但是它并不保证原子性。
  注意:volatile不能用于计数和统计等业务场景。因为volatile不能保证操作的原子性,可能会导致数据异常。ThreadLocal
  例如:
  publicclassTest{
  privateThreadLocalthreadLocalnewThreadLocal();
  publicvoidgetAge(inti){
  try{
  IntegerintegerthreadLocal。get();
  threadLocal。set(integernull?0:integeri);
  }catch(Exceptione){
  e。printStackTrace();
  }finally{
  threadLocal。remove();
  }
  }
  }这个例子中,使用了ThreadLocal,所以不存在线程安全问题。
  官方解释:ThreadLoal变量,线程局部变量,同一个ThreadLocal所包含的对象,在不同的Thread中有不同的副本且其它Thread不可访问,那就不存在多线程间共享的问题。
  注意:我们平常在使用ThreadLocal时,如果使用完之后,一定要记得在finally代码块中,调用它的remove方法清空数据,不然可能会出现内存泄露问题线程安全集合
  例如:publicclassHashMapTest{privatestaticConcurrentHashMapString,ObjecthashMapnewConcurrentHashMap();publicstaticvoidmain(String〔〕args){newThread(newRunnable(){Overridepublicvoidrun(){hashMap。put(key1,value1);}})。start();newThread(newRunnable(){Overridepublicvoidrun(){hashMap。put(key2,value2);}})。start();try{Thread。sleep(50);}catch(InterruptedExceptione){e。printStackTrace();}System。out。println(hashMap);}}这个例子中,使用了ConcurrentHashMap,所以不存在线程安全问题。
  常见的线程安全集合还有:Vector,Hashtable,CopyOnWriteArrayList,CopyOnWriteArraySet,ConcurrentSkipListMap,ConcurrentSkipListSet,ConcurrentLinkedQueue,ConcurrentLinkedDeque、使用Collections包装成线程安全等CAS
  publicclassTest{
  privateAtomicIntegeratomicIntegernewAtomicInteger();
  publicintgetAge(inti){
  returnatomicInteger。getAndAdd(i);
  }
  }这个例子中,使用了atomicInteger,所以不存在线程安全问题。
  synchronized加锁,同一时间,只能有一个线程访问,一致性得到了保障,并发性下降。CAS用的dowhile,没有加锁,反复的通过CAS比较,直到成功,既保证了一致性,又提高了并发性。
  逻辑上可以这么理解:java。util。concurrent。atomic这个包里面提供了一组原子类,其基本的特性就是在多线程环境下,当有多个线程同时执行这些类的实例包含的方法时,具有排他性,即当某个线程进入方法,执行其中的指令时,不会被其他线程打断,而别的线程就像自旋锁一样,一直等到该方法执行完成,才由JVM从等待队列中选择一个另一个线程进入。

话题意大利男篮逆境求生约老师抱憾空手而归没有加里纳利的意大利男篮在欧锦赛上能走多远?连他们自己的支持者都不看好。而当他们在淘汰赛遇到塞尔维亚且主教练被罚离场的情况下,他们又该怎么做呢?或许正是这些因素叠加在一起,激发……奶头乐效应再次显现李易峰事件VS女行长落马李易峰事件爆发,网络上又再一次掀起轩然大波,成为热搜事情。吃瓜群众纷纷跟进,从社会影响、行业动态、交易细节、粉丝反应等方面全方位跟进,把这事前前后后、里里外外扒了个底朝天,又是……9位儿女去国外留学的明星,一年学费花35万,晚年移居国外养老娱乐圈有不少明星把儿女送去国外留学,这些星二代就读的大部分是国外有名的私立学校,学费昂贵。而从小在国外长大的他们,有人成年后也留在国外工作和生活。1,李湘近日,有媒……1993年我国首次申奥,以两票之差输给悉尼,多年后才知晓黑幕2008年我国成功举办北京奥运会,可在这15年前,我们第1次申奥牵动了无数国人激动的心,虽说举国上下为此做足了准备,但当时仍旧以两票之差输给了悉尼。可这能代表两国真正的实力吗?……慢慢侃球一个亿?值大家好,欢迎来到今天的慢慢侃球。比赛战报汇总布莱顿52大胜莱斯特城,麦卡利斯特双响上半场比赛刚开始,伊希纳乔便帮助莱斯特城首开纪录,随后卢克托马斯自摆乌龙,布……人月共圆!来广州南沙天后宫一起共度首届中秋花灯节南方网讯中秋节临近,记者了解到,广州南沙天后宫将于9月9日9月12日举行‘花灯初上,湾区溢彩’2022年南沙首届中秋花灯节。为给市民营造中秋赏月游玩好去处,南沙天后宫时隔……欢迎!曝北京首钢弃将投奔马布里,正式加盟北控男篮媒体人爆料刘晓宇已经和北控男篮达成了协议最近,刘晓宇的去向备受关注,有多支CBA球队都有意签下刘晓宇。准确消息,据北京媒体爆料,刘晓宇已经跟北控男篮达成协议,因私人原因拒……炎症色素沉着了,如何修复!头条创作挑战赛炎症也是致黑的幕后黑手,炎症的过度活跃会导致炎性色沉。举个例子:长期长痘痘的人,皮肤的黑色素细胞会增多、引发色素沉着、皮肤也会变黑。容易发……中国女排再度无缘4强!人民日报总结4点收获,球迷对蔡斌意见很2022年女排世锦赛14决赛,中国女排vs意大利。13这个结果,说实话是有些意外的,能够在意大利身上揪下一块肉,已经超出了很多人的预期。不过,输的3局中,和预想中的差别也很大,……女人耗阳行为有哪些?建议这4件事要少做,不要任性阳气对于身体而言特别的重要,可以为身体提供能量,但是如果身体缺乏阳气的话,会造成身体成为空躯壳,严重的话会危及到生命。俗话经常说:阳气足,百病除,阳气在人体内可以发挥气化……新华全媒我国科学家拍摄到光催化剂光生电荷转移演化全时空图像新华社北京10月12日电(记者张泉、王莹)太阳光是一种丰富的可再生能源,通过和光催化剂发生作用,可以催化分解水产生氢气,以及还原二氧化碳产生太阳燃料(太阳能、水和含碳化合物转化……9月手机好评榜公布小米12SU连续三月第一,华为新机获得第二开始之前,先问一个问题:如果让你选择一台手机,你会优先看那些点?是价格?性能?配置?好评率?然而我认为实际体验,对于手机才是最重要的。然而在没有实际上手钱,好评率则能反应多数用……
干垃圾有哪些东西干垃圾包含哪些最近很火的垃圾分类除了我们平时常见的可回收、不可回收垃圾之外,还多了干垃圾和湿垃圾之分,这让很多人都无从下手,我们一起来了解下干垃圾是什么意思吧。干垃圾有哪些东西干垃圾包……不在北京也非上海,谁是中国最繁忙的机场?北京、上海、成都都有两座机场,白云机场独享广州,实现客流量三连冠图IC文《财经》记者王静仪编辑施智梁在这个混乱纷杂的时代,航站楼显然是秩序和逻辑的庇护所……立春后必吃的两道菜!养肝益胃利三焦!萝卜《本草纲目》里说:萝卜辛甘味凉,入肺胃二经,能够清肺化痰,开胃和中。这里的萝卜,主要指白萝卜,也是一种中药材,在入药时叫莱菔,用根茎或者果实菜籽入药。适当吃一些能够清……鸡蛋壳属于什么垃圾鸡蛋壳是干垃圾还是湿垃圾垃圾分类让不少朋友都头疼不已,一般来说,鸡蛋壳在定义上面应该是属于湿垃圾的,它是很明显的厨余垃圾,所以大家在进行垃圾分类的时候要注意了。鸡蛋壳属于什么垃圾鸡蛋壳属于湿垃圾……用过的卫生巾属于什么垃圾卫生巾是干垃圾还是湿垃圾垃圾分类在很多城市已经陆续开始实施,不过有些比较特别的垃圾让很多人都不知道应该怎么分类,比如用过的卫生巾应该算干垃圾还是湿垃圾,我们一起来看下这个问题的答案吧。用过的卫生巾属于……用过的猫砂属于什么垃圾猫砂怎么垃圾分类最近开始实施的垃圾分类,让不少人都很头疼,尤其是一些养了宠物的朋友,对于宠物的粪便完全不知道怎么处理,那么带有猫屎的猫砂我们应该扔到哪个垃圾分类里面呢?用过的猫砂属于什么垃圾……汪明荃赵雅芝两大不老女神同框,一个优雅婆婆,一个娇艳似少女爱美之心,女性皆有。因此,有不少女性即使已经上了年纪,但仍然会大力去追求属于自己的美,利用穿搭来让自己显得更加年轻,打造出不老女神的形象。而有些女性则与此不同,她们更倾向于通过……什么是垃圾分类呢垃圾分类有什么用呢大家应该在新闻里都有看见现在提倡垃圾分类吧,但是你了解垃圾分类吗?今天小编就和你们一起来了解一下吧,究竟什么是垃圾分类呢,以及垃圾分类有什么用呢。什么是垃圾分类呢垃圾分类……42岁柳岩曝新恋情!被拍到多次带男人回家过夜,网友吐槽太着急铁树终于要开花了!娱乐圈著名的性感女神柳岩疑似有了新恋情,消息一出也是引起网友们的热议,不过柳岩多次带男友回家也是遭到网友吐槽!知名娱记赵大明白最近更新了一则动态,晒出了……凉拌大葱,教你农家特色吃法,开胃下饭,鲜香入味,太解馋了凉拌大葱,教你农家特色吃法,开胃下饭,鲜香入味,太解馋了。每年的秋冬季,家里储存最多的应该就是大葱,几毛钱一斤,成捆往家买,大葱便宜耐储存,这个冬天我家最少都得用三捆,炒着吃的……医用棉签属于什么垃圾医用棉签是有害垃圾吗医用棉签是属于有害垃圾的,这里的医用是指医院的患者有用过的棉签,而我们普通家用的棉签在用过之后是归类到干垃圾的,大家不用弄混了。医用棉签属于什么垃圾医用棉签是有害垃圾的,……湿垃圾袋是什么垃圾受污染的垃圾袋是什么垃圾最近很多朋友都被垃圾分类中的干湿垃圾弄昏了头,其中装有湿垃圾的垃圾袋应该是算干垃圾的,也就是我们在将湿垃圾扔完之后,需要将垃圾袋扔到干垃圾里面。湿垃圾袋是什么垃圾湿垃圾袋……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网