awTT老是被男友糖尿害我蛀牙擦破了,怎么办,害我...

  原来自己也暗下决心,找男人不能找打我的,现在却犹豫不坚定。第一次打我忘了是因为什么,反正现在只要有点事,他就会打我。我也会还手,不过力量悬殊,挨打得都是我,有时确实也是我的错,我脾气也不好,着急就会骂他两句。但很多次都是因为小事, 他总是说他没用力,但是打在我身上很痛,多次沟通都无效啊,他总是保证了之后,过几天又忘了。别的方面, 他做得也很好,也想和他一辈子,但是,打我真的受不了了。怎么能让他改掉呢,怎么办呢
楼主发言:1次 发图:0张 | 更多
  没有故事背景看着胡涂。  
  一遇到感情的事就忧柔寡断,受不了了  
  就是他经常打我,我该怎么办,怎么能让他改掉  
  改不掉,甩了。不甩你自己活该被打。
  怎么个打法?不是暴力那种吧?你嘴贱时他推下也没啥。  
  第一次不把他拿下,现在打顺手了都,还改……打的时候都不心疼你,楼主啊,自求多福吧
  出轨和家暴是我的底线,一票否决,这个男人就算再好,碰了这两点,直接出局~~~
  1,分手,2,养成受虐体
  把他飞了吧。不可能改的。  打人就跟吸烟一样是有瘾的。  不打他不舒服,打完他开始后悔。有个毛用啊。
  要么能治住他,  1、他打你一次你找人狠揍他一顿,  2、他事后想和好,就让他用很难堪的方式,比如大庭广众之下给你下跪求和  3、让他给你买很贵很贵的礼物做赔偿,贵到让他想起来就心疼。  总之就是让他事后想起来打你就想到打完你付出的代价,就怕就后悔心疼肉痛。如果做不到,趁早离开他,不然就等着被打死吧。  
  换一个不打你的男朋友
  @猫咪嘟嘟宝贝
09:24:42  一遇到感情的事就忧柔寡断,受不了了  -----------------------------  改啥改,演一辈子双人对打,  以后有孩子了,三人打,多热闹。    
  楼主你真能忍,佩服!  
  改掉是不可能的  除非换人  否则会挨打一辈子  啧啧
  可怜之人必有可恨之处。。。。你男朋友大概觉得送上门打不打白不打,反正打不跑的
  你贱,,不打你打谁呢?
  挨打 LZ你真能忍=。=
  上面两楼说得对,楼主你自己犯贱  改不掉,换一个男朋友吧
  绝对不能让他打习惯了,如果你不想分手,那下次他再打你的时候,你就跟他拼了,抱着要么你帮我打死,否则我打死你的决心,打架绝不能输,经过这次估计他也怕了,我就是这样收服我老公的,当然该温柔的时候得温柔
  去练习搏击啊散打啦吧他打成你的专属M不就好了啊
  直接分了吧 我曾经的一个同事的男友也是打人 过后都很诚恳的道歉 也带她去吃好的 买衣服给她 对她也不错 但是下次还是打人 还在她手机里弄了个GPS定位
  要么楼主强大到能把他撂倒,要么分手
  你真贱  
  被拍的我心里都舒服,谢谢大家
,其实我有时候也特想把他绑起来揍一顿,好吧,我要坚决一点  
  这是病 得治
  杀了他。
  他是个高胖子,我一米六七,一百斤,搞死也拼不过他。天天看别的女的和男朋友打架,我都觉得非常不能忍,到自己头上了,确总是原谅,我擦,都想呼死我自己  
  换男人。
  [发自iPad客户端-贝客悦读]
  我跟你说,我跟我老公结婚12年,相识快二十年了,他都没动过我一下  你这样的,我都没法说了。如果我女儿要找了一个这样的男友还心存幻想的话,我就让她有多远滚多远
  楼主知道董珊珊不?  
  他纵有千个优点,但他不爱你,这就是一个会让你陷入绝境的最大缺点。
  无语,楼主快醒醒。
  换个男朋友不就得了 免得白费口舌还要再挨两拳
  上午我摇摇他胳膊让他把手机给我玩,他想甩开我,胳膊肘打着我嘴了,一直流血,道了个歉,说他困了,然后一句话都没了,我擦,我是有多贱,非要和你一起  
  改不了的,这种人有多远躲多远!  楼主你可别养成m体质啊!
  好吧,我去百度董珊珊了,看得我闷  
  lz我感觉我们很像阿 他到不是总打我 就是他有时候会推我 抱抱吧   
  改不了,离
  回复第27楼(作者:@猫咪嘟嘟宝贝 于
10:30)   他是个高胖子,我一米六七,一百斤,搞死也拼不过他。天天看别的女的和男朋友打架,我都觉得非常不能忍…… ==========  恩 力量悬殊 哎。lz是不是脾气特倔  
  本来以为是开玩笑的那种,但看上面说的,打出血了没什么反应觉得他根本不关心你啊,不会是已经习惯了根本没当回事了吧。那太可怕了,还是快分吧。
  分了吧
  如果你不肯分,你就要变得比他更暴力,以暴制暴。
  要么分手,要么楼主去报个武术班,到时候换成你打他
  我再犯贱再和他和好,我就把自己乎死  
  @猫咪嘟嘟宝贝
10:47:26  上午我摇摇他胳膊让他把手机给我玩,他想甩开我,胳膊肘打着我嘴了,一直流血,道了个歉,说他困了,然后一句话都没了,我擦,我是有多贱,非要和你一起  -----------------------------  楼主就是犯贱 受虐狂
  家庭暴力啊 最怕这种了。。。。。。。。
  楼主去学武,然后把他调教成M。
  上山学功夫,打回来……
  剁手。
  距离产生美  
  换一个不动手的男人做BF
  改不掉的,谢谢你为广大妹子带走了一个人渣,谢谢!  
  回杂货铺的店小二。是啊,楼主特倔啊特一根筋啊,楼主白羊座  
  这个貌似真的改不了,再好也不能要!!!!!  
  想想有一天,你们要结婚了,陪嫁婚礼不合他意,蜜月就揍你个乌眼青,你原谅他了~当你怀孕时,他揍你导致流产,你原谅他了~生完孩子,重男轻女的贱男要是看你生的女孩,月子里揍你,你原谅他了~等孩子略懂事一点儿,娘俩一块揍,你原谅他了~等他找了小三,和小三一块揍你,你还原谅他吗??别以为他不会这么无情,现在已经不在乎了,以后打起了会更顺手。你现在就是个会做饭洗衣伺候人的免费沙袋,破了再换一个罢了,温柔多情称心如意的爱人情人可不是你的定位,在他眼里,你不配~就是这样
  矮马这种人还想着改造
赶紧扔了吧
  换男盆友比较容易
  唉,这种事情又不好给朋友说,楼上说的拼死打回去,我也适过,结果他也拼死打回来了。那次憋足劲三天没理他,后来,后来又被哄好了,我闷,我真欠  
  换一个  
  换个男朋友,不过看楼主估计是个sm爱好者,就喜欢受虐,自己喜欢那能怪谁?
  改个蛋啊,赶紧分
  我白羊座,他摩羯,他平时也挺好,鞋带开了会帮我系,我吃剩的饭他也会接过去自然的吃掉,我每次都会嘴硬是他的错,但是心里确在埋怨自己,我这从小养成的狗脾气,别人一不开心,我就觉得是我的原因,我错了。小孩从小的心里培养很重要啊  
  你欠揍你问个屁啊。
  坚决分开  男的能对你动一次手,就会有第二次、第三次。。。
  他很有钱吗?  让你这样甘愿受虐
  想办法,让自己浑身长刺,打你他疼
  下安眠药,半夜睡着了捆起来揍,他他你哪儿你就打他哪儿,他用手你用棒子,你也没用力气打
  赶紧踹了,打女人的男人都是渣  
  这个你可以看看天津卫视的爱情保卫战,里面有这样一对,跟你一模一样的,最后调解好了,你也可以上这个节目试试啊
  这种男人留着干嘛?楼主是不是有点特殊癖好?
  换人!
  @小狐狸想飞
11:11:17  想想有一天,你们要结婚了,陪嫁婚礼不合他意,蜜月就揍你个乌眼青,你原谅他了~当你怀孕时,他揍你导致流产,你原谅他了~生完孩子,重男轻女的贱男要是看你生的女孩,月子里揍你,你原谅他了~等孩子略懂事一点儿,娘俩一块揍,你原谅他了~等他找了小三,和小三一块揍你,你还原谅他吗??别以为他不会这么无情,现在已经不在乎了,以后打起了会更顺手。你现在就是个会做饭洗衣伺候人的免费沙袋,破了再换一个罢了,温柔多......  -----------------------------  π
  打人会上瘾的,果断分啊!
  其实我也是个极品。楼主长相还对得起观众,但楼主很自卑,为毛,呢?因为楼主腿毛很长啊,就是很长很黑,所以楼主觉得这辈子找不到好对象了,,我哭,  
  只能说明你欠挨,都打你了还不分手,楼主可千万别放手,省得这个渣男祸害别人  
  楼主真脑残  
  楼主木有特殊癖好,就是一直觉得他会改,还有,因为,他见过我腿毛长长的时候他木有嫌弃,,,  
  难道你要因为腿毛挨一辈子打?  
  回复第35楼,@猫咪嘟嘟宝贝  上午我摇摇他胳膊让他把手机给我玩,他想甩开我,胳膊肘打着我嘴了,一直流血,道了个歉,说他困了,然后一句话都没了,我擦,我是有多贱,非要和你一起  [消息来自掌中天涯]  --------------------------  我擦。。。LZ。。。。看到这里我实在看不下去了!!!  这你都能忍。。。。再不分手你活该被打啊。。。  
  看上去,打你不是一次两次了,这个是改不掉的,劝你一句,离开吧,把爱给一个动手打你的人,不值得!
  改不了 不想挨打就分手
  回复第57楼,@小狐狸想飞  想想有一天,你们要结婚了,陪嫁婚礼不合他意,蜜月就揍你个乌眼青,你原谅他了~当你怀孕时,他揍你导致流产,你原谅他了~生完孩子,重男轻女的贱男要是看你生的女孩,月子里揍你,你原谅他了~等孩子略懂事一点儿,娘俩一块揍,你原谅他了~等他找了小三,和小三一块揍你,你还原谅他吗??别以为他不会这么无情,现在已经不在乎了,以后打起了会更顺手。你现在就是个会做饭洗衣伺候人的免费沙袋,破了再换一个罢了,温柔多情称心如意的爱人情人可不是你的定位,在他眼里,你不配~就是这样  --------------------------  +1  我也白羊座的。白羊座没有LZ这么包子好么???  
  他没钱,胖,长得一般,开始谈对我很好,有次大冬天我家没人,他知道我怕黑,在楼下站了一夜,他原来也不打我,我就是觉得,有感情了,舍不得,想让他改,因为他别的方面做得不错,看来是我错了  
  换一个
  跪求楼猪不要跟禽兽男分手!千万要结婚!不要祸害别人!
  [发自iPhone客户端-贝客悦读]
  打顺手了。。。  以前我也老爱打前男友,打到后面就是暴打。。  银手镯打断了2个。  后面他给我买了一个翡翠手镯,还说要我天天戴着。。  然后就没有然后了。。
  楼主,强烈推荐你去看部老连续剧,《不要和陌生人说话》。这个男人现在还只是你男朋友就老打你,你居然还想着跟他过下去,世上的其他男人都死光了吗?
  打就“疼~~~~~”,,,骂就“哎~~~~~”
  一刀两断  
  者:爱游泳的大猫咪 回复日期: 10:38:27  回复
  我跟你说,我跟我老公结婚12年,相识快二十年了,他都没动过我一下  你这样的,我都没法说了。如果我女儿要找了一个这样的男友还心存幻想的话,我就让她有多远滚多远  ----------------------  +1,如果以后我女儿也眼残脑残找个这样的男人,还死不听劝,我只能狠狠甩她一巴掌让她滚,眼不见为净。当白养了。
  作者:猫咪嘟嘟宝贝 回复日期: 11:41:12  回复
  他没钱,胖,长得一般,开始谈对我很好,有次大冬天我家没人,他知道我怕黑,在楼下站了一夜,他原来也不打我,我就是觉得,有感情了,舍不得,想让他改,因为他别的方面做得不错,看来是我错了  ------------------  没钱,胖,长得一般。要还对你不好,你能跟他??他这种喜欢使用暴力的人,你当心结婚以后被打得更严重,因为结婚了你就更不会跑掉落。以后有孩子了,孩子也跟着你挨打!你自作自受就算了,还得连累孩子,你想过你的孩子没有?  这种男人凤姐都不会要,你就那么差,找不到更好的男人了吗
  作者:猫咪嘟嘟宝贝 回复日期: 11:36:08  回复
  楼主木有特殊癖好,就是一直觉得他会改,还有,因为,他见过我腿毛长长的时候他木有嫌弃,,,  ----------------------  腿毛长的MM多了去,淘宝的刮毛器卖那么多,对于这个有必要这样自卑吗?这种也能算对你好,真是够了。
  我咋觉得,楼主不是来诉苦的  打啊打的就习惯了~~
  分手,头天晚上把他灌醉绑在床上用皮带抽醒,给他小弟弟上放冰砖直到冰砖化掉,菊花里用注射器拔掉针头打进风油精掌握好量。  =============================================================  不过按照你这个包子的性格这些你也就只能想想了
  不可能改的,你只能离开这种渣男。  这种男人只有比他更厉害的女人能收拾。
使用“←”“→”快捷翻页Java多线程发展简史-真格学网-IT技术综合网站
Java多线程发展简史
来源: &责任编辑:小易 &时间: 20:17:16
java程序可以有多个main方法答:每一个java文件都会有一个publicstaticvoidmain(String[]args)作为程序作为入口,一个类有且只有一个,但是可以有与他不同的,比如:voidmain(),voidmain(inta),都是可以的,在不同类中,是可以有多个publicstaticvoidmain(String[]a...java中一个类中能如何声明多个构造方法答:eclipse-Source-GenerateConstructorusingFields还有GenerateConstructorfromSuperclass这是IDE自带生成方法可以重载同名不同参Java为什么可以在多个平台上运行?答:Java代码是字节代码,就像楼上所说的Java是运行在虚拟机上的,虚拟机将Java字节代码和具体的平台给隔开,不同平台上面运行的虚拟机是不一样的,而这些虚拟机对Java代码要求是一样的,所以Java可以在多个平台运行Java多线程发展简史(图1)Java多线程发展简史(图2)Java多线程发展简史(图3)Java多线程发展简史(图4)Java多线程发展简史(图5)Java多线程发展简史(图6)
这篇文章,大部分内容,是周五我做的一个关于如何进行Java多线程编程的Knowledge Sharing的一个整理,我希望能对Java从第一个版本开始,在多线程编程方面的大事件和发展脉络有一个描述,并且提及一些在多线程编程方面常见的问题。对于Java程序员来说,如果从历史的角度去了解一门语言一个特性的演进,或许能有不同收获。
现在是java用的多,还是C语言用的多答:首先,C语言是面向过程的语言,执行效率高;Java是面向对象的语言,执行效率比C语言低。C语言最关键的是比Java多了指针,这也说明了Java的健壮性,还有Java的多线程机制使程序可以并行运行,Java程序多用于网络。C语言的安全性不如Java,C语言没...。防恶意抓取,请查看原文,,真格学网提供内容。引言
首先问这样一个问题,如果提到Java多线程编程,你会想到什么?
volatile、synchronized关键字?
竞争和同步?
线程安全问题?
线程池和队列?
java中如何继承多个父类,如何实现多个接口?答:class类implements接口1,接口2,...class子类extends父类父类只能继承一个,java不允许多重继承。当然,可以使用内部类或。防恶意抓取,请查看原文,,真格学网提供内容。好吧,请原谅我在这里卖的关子,其实这些都对,但是又不足够全面,如果我们这样来谈论Java多线程会不会全面一些:
模型:JMM(Java内存模型)和JCM(Java并发模型)
使用:JDK中的并发包
实践:怎样写线程安全的代码
除错:使用工具来分析并发问题
求问,java中如何进行多行输入问:java多行输入,第一行代表数组的容量,第二行代表的是数组的元素答:第一行输入数组的元素个数,第二行输入数组的元素,代码如下:importjava.util.SpublicclassTest{publicstaticvoidmain(String[]args){Scannerin=newScanner(System.in);System.out.p。防恶意抓取,请查看原文,,真格学网提供内容。可是,这未免太死板了,不是么?
J***A如何产生多个随机数问:inta=(int)(Math.random()*10);System.out.println(a);这样就产生了...答:packagegy.m8.d98;import。防恶意抓取,请查看原文,,真格学网提供内容。不如换一个思路,我们少谈一些很容易查到的语法,不妨从历史的角度看看Java在多线程编程方面是怎样进化的,这个过程中,它做了哪些正确的决定,犯了哪些错误,未来又会有怎样的发展趋势?
怎么同时运行java几个类问:如图,我想同时运行,怎么做?答:如果是在同一个包里的多个类的话,执行的时候只要运行有Main函数的类就可以了。如果是不同包里的多个类的话,在类文件里用import语句把在。防恶意抓取,请查看原文,,真格学网提供内容。另外,还有一点要说是,我希望通过大量的实例代码来说明这些事情。Linus说:&Talk is cheap, show me the code.&。下文涉及到的代码我已经上传,可以在此打包下载。
java为什么那么多的人去学答:java简单啊,培训一下就OK了,简单入门快。学C类或者走工控就要学计算机原理,windows原理,汇编,C,C++,MFC,python,这些可不是几年能学会的,学C类语言成本太大,时间长。最最主要,不好培训,,四个月学不会,就没人学了,培训机构得赚钱...。防恶意抓取,请查看原文,,真格学网提供内容。诞生
Java的基因来自于1990年12月Sun公司的一个内部项目,目标设备正是家用电器,但是C++的可移植性和API的易用性都让程序员反感。旨在解决这样的问题,于是又了Java的前身Oak语言,但是知道1995年3月,它正式更名为Java,才算Java语言真正的诞生。
java多线程同步可一理解为多个单线程运行吗?。线程的状态与生命周期:Java使用java.lang.Thread类及其子类的对象表示线程,新...不提倡使用线程的优先级来保证算法的正确执行。要编写正确、跨平台的多线程代码,必...。防恶意抓取,请查看原文,,真格学网提供内容。JDK 1.0
java程序员的发展前景怎么样?综合上述,Java的生命力体现在如下方面:1.Java产生与流行是InterNet发展的客观要求...可移植的,性能很优异的,多线程的,动态的,适合的Internet环。防恶意抓取,请查看原文,,真格学网提供内容。1996年1月的JDK1.0版本,从一开始就确立了Java最基础的线程模型,并且,这样的线程模型再后续的修修补补中,并未发生实质性的变更,可以说是一个具有传承性的良好设计。
刚看完J***A入门123,最多学到了多线程编程和基础的J***ASw...单方面发展吧,继续专研java可以往深处;jvm虚拟机;javaspringmvc,javaweb,分布式运。防恶意抓取,请查看原文,,真格学网提供内容。抢占式和协作式是两种常见的进程/线程调度方式,操作系统非常适合使用抢占式方式来调度它的进程,它给不同的进程分配时间片,对于长期无响应的进程,它有能力剥夺它的资源,甚至将其强行停止(如果采用协作式的方式,需要进程自觉、主动地释放资源,也许就不知道需要等到什么时候了)。Java语言一开始就采用协作式的方式,并且在后面发展的过程中,逐步废弃掉了粗暴的stop/resume/suspend这样的方法,它们是违背协作式的不良设计,转而采用wait/notify/sleep这样的两边线程配合行动的方式。
java语言的国内外研究现状和发展趋势从近期来看,埃利森传达的信号也许不是很重要,因为如今Java已成气候,要改变发展方向...Oracle甚至可能会掏钱请电脑厂商来推销Java和JavaFX,而处理极限多线程方面的性能...。防恶意抓取,请查看原文,,真格学网提供内容。一种线程间的通信方式是使用中断:
java的面相对象,IO,类集,多线程都已经熟悉掌握了,不知道往哪发...现在主流是JavaEE和Android。防恶意抓取,请查看原文,,真格学网提供内容。public&class&InterruptCheck&extends&Thread&{ && &&&&&@Override&&&&&public&void&run()&{ &&&&&&&&&System.out.println(&start&); &&&&&&&&&while&(true) &&&&&&&&&&&&&if&(Thread.currentThread().isInterrupted()) &&&&&&&&&&&&&&&&&break; &&&&&&&&&System.out.println(&while&exit&); &&&&&} && &&&&&public&static&void&main(String[]&args)&{ &&&&&&&&&Thread&thread&=&new&InterruptCheck(); &&&&&&&&&thread.start(); &&&&&&&&&try&{ &&&&&&&&&&&&&sleep(2000); &&&&&&&&&}&catch&(InterruptedException&e)&{ &&&&&&&&&} &&&&&&&&&thread.interrupt(); &&&&&} &}&
J***A语言的发展与未来应用与那些解释型的高级脚本语言相比,Java的确是高性能的。事实上,Java的运行速度随着JIT(Just-In-Time)编译器技术的发展越来越接近于C++。10、Java语言是多线程的。在J...。防恶意抓取,请查看原文,,真格学网提供内容。这是中断的一种使用方式,看起来就像是一个标志位,线程A设置这个标志位,线程B时不时地检查这个标志位。另外还有一种使用中断通信的方式,如下:
如何使星际争霸2强制CPU满线程?3特点4与进程比较5守护线程6线程的同步7线程状态变化发展简史线程的引入:...C#守护线程类1:守护线程类1线程的同步线程的同步是Java多线程编程的难点,往往..。防恶意抓取,请查看原文,,真格学网提供内容。public&class&InterruptWait&extends&Thread&{ &&&&&public&static&Object&lock&=&new&Object(); && &&&&&@Override&&&&&public&void&run()&{ &&&&&&&&&System.out.println(&start&); &&&&&&&&&synchronized&(lock)&{ &&&&&&&&&&&&&try&{ &&&&&&&&&&&&&&&&&lock.wait(); &&&&&&&&&&&&&}&catch&(InterruptedException&e)&{ &&&&&&&&&&&&&&&&&System.out.println(Thread.currentThread().isInterrupted()); &&&&&&&&&&&&&&&&&Thread.currentThread().interrupt();&&&&&&&&&&&&&&&&&&System.out.println(Thread.currentThread().isInterrupted()); &&&&&&&&&&&&&&&&&e.printStackTrace(); &&&&&&&&&&&&&} &&&&&&&&&} &&&&&} && &&&&&public&static&void&main(String[]&args)&{ &&&&&&&&&Thread&thread&=&new&InterruptWait(); &&&&&&&&&thread.start(); &&&&&&&&&try&{ &&&&&&&&&&&&&sleep(2000); &&&&&&&&&}&catch&(InterruptedException&e)&{ &&&&&&&&&} &&&&&&&&&thread.interrupt(); &&&&&} &}&
java死锁需要仔细分析代码才能看出,对于规模较大的多线程程序来说尤其如此。好的线程分析工...这是因为事情可能按照比较理想的情况发展-Producer线程不需要被Consumer占据的锁...。防恶意抓取,请查看原文,,真格学网提供内容。在这种方式下,如果使用wait方法处于等待中的线程,被另一个线程使用中断唤醒,于是抛出InterruptedException,同时,中断标志清除,这时候我们通常会在捕获该异常的地方重新设置中断,以便后续的逻辑通过检查中断状态来了解该线程是如何结束的。
作为一名java程序员,线程是否有必要掌握的很清楚,公司项目是...如果以后想做游戏方面的开发那线程是必须要重点掌握的如果是javaEE方向那线程其实用到的地方比较少可以不必掌握的很清楚但是不管你往哪方面发展一般的公司笔试面...。防恶意抓取,请查看原文,,真格学网提供内容。在比较稳定的JDK 1.0.2版本中,已经可以找到Thread和ThreadUsage这样的类,这也是线程模型中最核心的两个类。整个版本只包含了这样几个包:java.io、 java.util、java.net、java.awt和java.applet,所以说Java从一开始这个非常原始的版本就确立了一个持久的线程模型。
。防恶意抓取,请查看原文,,真格学网提供内容。值得一提的是,在这个版本中,原子对象AtomicityXXX已经设计好了,这里给出一个例子,说明i++这种操作时非原子的,而使用原子对象可以保证++操作的原子性:
球王第一个条件:以核心身份带队拿到世界杯。小罗拿到世界杯的时候,在巴西队中是新丁。哈维、小白拿到世界杯的时候,靠的是团队,西班牙打的是整体牌。另外如果没有卡西利亚斯两拒罗老汉单刀,常规时间西班牙已沉没。防恶意抓取,请查看原文,,真格学网提供内容。import&java.util.concurrent.atomic.AtomicI && &public&class&Atomicity&{ && &&&&&private&static&volatile&int&nonAtomicCounter&=&0; &&&&&private&static&volatile&AtomicInteger&atomicCounter&=&new&AtomicInteger(0); &&&&&private&static&int×&=&0; && &&&&&public&static&void&caculate()&{ &&&&&&&&×++; &&&&&&&&&for&(int&i&=&0;&i&&&1000;&i++)&{ &&&&&&&&&&&&&new&Thread(new&Runnable()&{ &&&&&&&&&&&&&&&&&@Override&&&&&&&&&&&&&&&&&public&void&run()&{ &&&&&&&&&&&&&&&&&&&&&nonAtomicCounter++; &&&&&&&&&&&&&&&&&&&&&atomicCounter.incrementAndGet(); &&&&&&&&&&&&&&&&&} &&&&&&&&&&&&&}).start(); &&&&&&&&&} && &&&&&&&&&try&{ &&&&&&&&&&&&&Thread.sleep(1000); &&&&&&&&&}&catch&(InterruptedException&e)&{ &&&&&&&&&} &&&&&} && &&&&&public&static&void&main(String[]&args)&{ &&&&&&&&&caculate(); &&&&&&&&&while&(nonAtomicCounter&==&1000)&{ &&&&&&&&&&&&&nonAtomicCounter&=&0; &&&&&&&&&&&&&atomicCounter.set(0); &&&&&&&&&&&&&caculate(); &&&&&&&&&} && &&&&&&&&&System.out.println(&Non-atomic&counter:&&&+×&+&&:&&&&&&&&&&&&&&&&&&+&nonAtomicCounter); &&&&&&&&&System.out.println(&Atomic&counter:&&&+×&+&&:&&+&atomicCounter); &&&&&} &}&
当我们发现孩子情绪不好的时候,应该及时让孩子表达自己不好的情绪,而不是置之不理,更不能对孩子生气或者表现出不耐烦。那我们该如何疏导呢?当我女儿出现情绪不好的时候,我一般是这样处理的:我会很关心的问她发生了什么,希望她能够说出来给我听听。耐心的听她讲完后,对她的情绪表示理解。再问问她有什么想法和打算,如果她不知道,那我会和她一起想办法,让她正确的合理的释放自己的不好情绪。正确的疏导孩子的不好情绪,对孩子的身心健康很重要,希望家长不要忽视。。防恶意抓取,请查看原文,,真格学网提供内容。上面这个例子你也许需要跑几次才能看到效果,使用非原子性的++操作,结果经常小于1000。
传统上来说,肯定是金九银十是买车的最佳时机,因为这两个月是年前冲刺的关键,厂家和经销商往往会搞一些优惠促销活动,就如同双十一活动一样,一旦过了活动期,一切又归于沉寂。当然,什么事情都不是绝对的,一般来。防恶意抓取,请查看原文,,真格学网提供内容。对于锁的使用,网上可以找到各种说明,但表述都不够清晰。请看下面的代码:
NBA常规赛一共有82场比赛,30支球队为了季后赛名额厮杀。换句话说,想要进入季后赛你就必须排名前八。不过东部和西部,进入前八的“难度”有所不同。正如球迷们所熟知的“西强东弱”局面,2008年的西部进。防恶意抓取,请查看原文,,真格学网提供内容。public&class&Lock&{ &&&&&private&static&Object&o&=&new&Object(); &&&&&static&Lock&lock&=&new&Lock(); && &&&&&&&&&&public&synchronized&void&dynamicMethod()&{ &&&&&&&&&System.out.println(&dynamic&method&); &&&&&&&&&sleepSilently(2000); &&&&&} && &&&&&&&&&&public&static&synchronized&void&staticMethod()&{ &&&&&&&&&System.out.println(&static&method&); &&&&&&&&&sleepSilently(2000); &&&&&} && &&&&&&&&&&public&void&thisBlock()&{ &&&&&&&&&synchronized&(this)&{ &&&&&&&&&&&&&System.out.println(&this&block&); &&&&&&&&&&&&&sleepSilently(2000); &&&&&&&&&} &&&&&} && &&&&&&&&&&public&void&objectBlock()&{ &&&&&&&&&synchronized&(o)&{ &&&&&&&&&&&&&System.out.println(&dynamic&block&); &&&&&&&&&&&&&sleepSilently(2000); &&&&&&&&&} &&&&&} && &&&&&&&&&&public&static&void&classBlock()&{ &&&&&&&&&synchronized&(Lock.class)&{ &&&&&&&&&&&&&System.out.println(&static&block&); &&&&&&&&&&&&&sleepSilently(2000); &&&&&&&&&} &&&&&} && &&&&&private&static&void&sleepSilently(long&millis)&{ &&&&&&&&&try&{ &&&&&&&&&&&&&Thread.sleep(millis); &&&&&&&&&}&catch&(InterruptedException&e)&{ &&&&&&&&&&&&&e.printStackTrace(); &&&&&&&&&} &&&&&} && &&&&&public&static&void&main(String[]&args)&{ && &&&&&&&&&&&&&&&&&&new&Thread()&{ &&&&&&&&&&&&&@Override&&&&&&&&&&&&&public&void&run()&{ &&&&&&&&&&&&&&&&&lock.dynamicMethod(); &&&&&&&&&&&&&} &&&&&&&&&}.start(); &&&&&&&&&new&Thread()&{ &&&&&&&&&&&&&@Override&&&&&&&&&&&&&public&void&run()&{ &&&&&&&&&&&&&&&&&lock.thisBlock(); &&&&&&&&&&&&&} &&&&&&&&&}.start(); &&&&&&&&&new&Thread()&{ &&&&&&&&&&&&&@Override&&&&&&&&&&&&&public&void&run()&{ &&&&&&&&&&&&&&&&&lock.objectBlock(); &&&&&&&&&&&&&} &&&&&&&&&}.start(); && &&&&&&&&&sleepSilently(3000); &&&&&&&&&System.out.println(); && &&&&&&&&&&&&&&&&&&new&Thread()&{ &&&&&&&&&&&&&@Override&&&&&&&&&&&&&public&void&run()&{ &&&&&&&&&&&&&&&&&lock.staticMethod(); &&&&&&&&&&&&&} &&&&&&&&&}.start(); &&&&&&&&&new&Thread()&{ &&&&&&&&&&&&&@Override&&&&&&&&&&&&&public&void&run()&{ &&&&&&&&&&&&&&&&&lock.classBlock(); &&&&&&&&&&&&&} &&&&&&&&&}.start(); && &&&&&} &}&
微信属于谁,这个世界级社交软件去年为腾讯带来直逼200亿的收入,虽然不是腾讯项目里最高,但它为腾讯带来的社交流量超8亿,围绕微信形成了通信、社交、阅读、致富、服务生态,已经发展成实质的操作系统,在社交方面,阿里、百度已经难以抗衡,只能差异化发展。这一切都是腾讯高级产品经理、高级副总裁张小龙团队的功劳,但在微信出现之前,张小龙还不广为人知时,他仅仅是腾讯收购的FoxMail负责人。今年微信大权仍旧握在张小龙手中,明年就不一定了,微信在国民生活工作里重要性越来越高,有越来越多的人影响微信的发展和张小龙的判断,而不再是之前张小龙一人决定微信走向。到底是马董的微信还是张总裁的微信,这样的问题中国历史上。防恶意抓取,请查看原文,,真格学网提供内容。上面的例子可以反映对一个锁竞争的现象,结合上面的例子,理解下面这两条,就可以很容易理解synchronized关键字的使用:
非静态方法使用synchronized修饰,相当于synchronized(this)。
静态方法使用synchronized修饰,相当于synchronized(Lock.class)。
木质房屋,顾名思义就是使用木质材料建构房屋。其实这里所说的木质房屋,其实并不是什么新玩意,作为一个拥有四千年历史的文明古国,木质房屋我们的祖辈早就采用了。现在在中国除了一些挂着“文物单位”牌子的、少数民族地区及林区外,基本上木质房屋在中国是近乎绝迹的了。现在说起来,多少有点老调重弹的味道。  我认为,木质房屋是否能在中国发展,要看木质房屋是否符合中国国情。  一、成本的问题  与一些人士认为的木质。防恶意抓取,请查看原文,,真格学网提供内容。JDK 1.2
如今手机内存卡尺寸越来越小,但容量却越来越大,价格也越来越低,不过即便是同一品牌相同容量的不同型号内存卡价格也可能不一样,这里面就会涉及到一些内存卡的技术与概念问题。内存卡对于很多朋友或许都缺乏了解,。防恶意抓取,请查看原文,,真格学网提供内容。1998年年底的JDK1.2版本正式把Java划分为J2EE/J2SE/J2ME三个不同方向。在这个版本中,Java试图用Swing修正在 AWT中犯的错误,例如使用了太多的同步。可惜的是,Java本身决定了AWT还是Swing性能和响应都难以令人满意,这也是Java桌面应用难以比及其服务端应用的一个原因,在IBM后来的SWT,也不足以令人满意,JDK在这方面到JDK 1.2后似乎反省了自己,停下脚步了。值得注意的是,JDK高版本修复低版本问题的时候,通常遵循这样的原则:
向下兼容。所以往往能看到很多重新设计的新增的包和类,还能看到deprecated的类和方法,但是它们并不能轻易被删除。
严格遵循JLS(Java Language Specification),并把通过的新JSR(Java Specification Request)补充到JLS中,因此这个文档本身也是向下兼容的,后面的版本只能进一步说明和特性增强,对于一些最初扩展性比较差的设计,也会无能为力。这个在下文中关于ReentrantLock的介绍中也可以看到。
时至今日《西游记》已经被无数次翻拍,星爷导的《西游》系列,彭于晏等人主演的《悟空传》等等,然而谁也无奈替代原著中孙悟空的经典抽象,而其他的作品则令观众们难以接受。而六小龄童似乎也看不惯其他作品对于《西游记》的“戏说恶搞”,宣布将联手美国重拍西游记!命名《敢问路在何方》而时至今日,86版《西游记》的唐僧扮演者迟重瑞已65岁,六小龄童已58岁,马德华也已72岁了,而因86版沙僧闫怀礼已去世,以是将启用2000年版《西游记续集》的沙僧刘大刚继承扮演,而刘大刚也过了70岁,四人平均年龄已过六旬,不禁让人担忧他们能否像年轻时一样继承生龙活虎的西游。六小龄童在访谈中表达,孙悟空绝不可能变成情种,因为他是无。防恶意抓取,请查看原文,,真格学网提供内容。在这个版本中,正式废除了这样三个方法:stop()、suspend()和resume()。下面我就来介绍一下,为什么它们要被废除:
驾照是一种怎样的神奇体验?那简直就是一部掺杂着血与泪的成长史啊!教练经典语录如下:1.教练:“拿到驾照就锁到抽屉里当个纪念吧”2.教练:“你不怕吗?”我:“我不怕!”教练:“我怕!”3.教练:“开那么。防恶意抓取,请查看原文,,真格学网提供内容。public&class&Stop&extends&Thread&{ &&&&&@Override&&&&&public&void&run()&{ &&&&&&&&&try&{ &&&&&&&&&&&&&while&(true) &&&&&&&&&&&&&&&&&; &&&&&&&&&}&catch&(Throwable&e)&{ &&&&&&&&&&&&&e.printStackTrace(); &&&&&&&&&} &&&&&} && &&&&&public&static&void&main(String[]&args)&{ &&&&&&&&&Thread&thread&=&new&Stop(); &&&&&&&&&thread.start(); && &&&&&&&&&try&{ &&&&&&&&&&&&&sleep(1000); &&&&&&&&&}&catch&(InterruptedException&e)&{ &&&&&&&&&} && &&&&&&&&&thread.stop(new&Exception(&stop&));&&&&&&} &}&
现在来看,娱乐一下还行~至于能不能变成“支付鸨版陌陌”,还有待下不一步开发吧!很荣幸,昨天第一次看到“支付鸨”这条新闻,我就下意识的打开了许久未曾打开的支付宝,点开了从未涉及的芝麻信用。我居然有752分,真的很荣幸~被马云选上“有身份的人”,可以逛圈子了~~果然,我在首页看到了这个“邀你加入生活圈”——校园日记!由于,小编是一个男的,所以不能发动态。只可以选择点赞、打赏、评论动态。。。不过,为什么我的生活圈,就没有像这种图片呢?也不像大家讲的,什么各种取陌陌而代之的功能,只是看到一些陌生的女人,各种晒图片、各种打广告、各种微商宣传。。。不过发展一下,确实可以有陌陌的效果,但是感官不如看片。但是。防恶意抓取,请查看原文,,真格学网提供内容。从上面的代码你应该可以看出两件事情:
使用stop来终止一个线程是不讲道理、极其残暴的,不论目标线程在执行任何语句,一律强行终止线程,最终将导致一些残缺的对象和不可预期的问题产生。
被终止的线程没有任何异常抛出,你在线程终止后找不到任何被终止时执行的代码行,或者是堆栈信息(上面代码打印的异常仅仅是main线程执行stop语句的异常而已,并非被终止的线程)。
生娃之前觉得生完娃后还是可以和以前一样“浪啊浪”的等我真的生完娃后才发现以前tooyoung了~首先是心态上脸皮真的变厚了很多,觉得生娃时什么大风大浪没见过?(在产床上痛的像杀猪一样叫;让几个人盯着自己最私密部位;从鬼门关走过一遭等等)以前看到老板连话都说不出口,现在能厚着脸皮跟老板讨价还价,3句不离涨工资、奖金。另外,只要是涉及到我家娃的问题,对娃有害的事儿,不管你谁,都坚决不妥协!容易被感动。。防恶意抓取,请查看原文,,真格学网提供内容。很难想象这样的设计出自一个连指针都被废掉的类型安全的编程语言,对不对?再来看看suspend的使用,有引起死锁的隐患:
平时应关着通风要向外  家住含光路柠檬公寓的薛女士来电反映,她和姐姐住在一起,最近天气热了,经常为卫生间的门应该关着还是打开的事情争执不休,感到十分苦恼。薛女士家住柠檬公寓,卫生间没有窗户,姐姐经常将。防恶意抓取,请查看原文,,真格学网提供内容。public&class&Suspend&extends&Thread&{ &&&&&@Override&&&&&public&void&run()&{ &&&&&&&&&synchronized&(this)&{ &&&&&&&&&&&&&while&(true) &&&&&&&&&&&&&&&&&; &&&&&&&&&} &&&&&} && &&&&&public&static&void&main(String[]&args)&{ &&&&&&&&&Thread&thread&=&new&Suspend(); &&&&&&&&&thread.start(); && &&&&&&&&&try&{ &&&&&&&&&&&&&sleep(1000); &&&&&&&&&}&catch&(InterruptedException&e)&{ &&&&&&&&&} && &&&&&&&&&thread.suspend(); && &&&&&&&&&synchronized&(thread)&{&&&&&&&&&&&&&&System.out.println(&got&the&lock&); &&&&&&&&&&&&&thread.resume(); &&&&&&&&&} &&&&&} &}&
不见得华为比ov强。ov在技术方面未必比华为差。在操作界面,软件应用等方面就不差。任正谁还说华为手机在某些方面不如ov呢。不要再黑ov博人眼求了。ov手机有多长的历史了,同期的手机厂家关门的海了去了,ov能生存到现在就证明了他的成功。当年的联想手机,阿尔卡通,诺基亚差吗?都比当年的ov强,结果如何?不要想着华为技术强,就什么都比别人强。防恶意抓取,请查看原文,,真格学网提供内容。从上面的代码可以看出,Suspend线程被挂起时,依然占有锁,而当main线程期望去获取该线程来唤醒它时,彻底瘫痪了。由于suspend在这里是无期限限制的,这会变成一个彻彻底底的死锁。
其实在昆明5000的工资真的很低,我11年大学毕业参加工作,从1200开始拿起,整整一年,每个月生活费,交通费***费,网费,餐费加起来,家里每个月还要补助我1000块钱,才能勉强维持生活,那时候只有五。防恶意抓取,请查看原文,,真格学网提供内容。相反,看看这三个方法的改进品和替代品:wait()、notify()和sleep(),它们令线程之间的交互就友好得多:
香菜做为评价两极分化最严重的食材之一。不喜欢它的人对它嗤之以鼻,甚至有人表示香菜的味道闻起来像是这个...香菜英文名字的词根是“臭虫”可想而知它的味道对于某些人来说有多可怕。不过,根据科学家的研究表示。防恶意抓取,请查看原文,,真格学网提供内容。public&class&Wait&extends&Thread&{ &&&&&@Override&&&&&public&void&run()&{ &&&&&&&&&System.out.println(&start&); &&&&&&&&&synchronized&(this)&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&try&{ &&&&&&&&&&&&&&&&&this.wait(); &&&&&&&&&&&&&}&catch&(InterruptedException&e)&{ &&&&&&&&&&&&&&&&&e.printStackTrace();&&&&&&&&&&&&&&} &&&&&&&&&} &&&&&} && &&&&&public&static&void&main(String[]&args)&{ &&&&&&&&&Thread&thread&=&new&Wait(); &&&&&&&&&thread.start(); &&&&&&&&&try&{ &&&&&&&&&&&&&sleep(2000); &&&&&&&&&}&catch&(InterruptedException&e)&{ &&&&&&&&&} &&&&&&&&&synchronized&(thread)&{ &&&&&&&&&&&&&System.out.println(&Wait()&will&release&the&lock!&); &&&&&&&&&&&&&thread.notify(); &&&&&&&&&} &&&&&} &}&
狗狗在45天左右接种第一针疫苗,以后每隔21天接种一次。在狗狗完全接种完疫苗之前,不宜接触外界环境,因为狗狗的免疫系统尚未完全形成,很容易染病。虽然不宜外出走动,但是在这期间,对于狗狗来说社会化非常重要。社会化也就意味着让狗狗出去见人,见狗,见车,见识外面的一切。狗狗在4个半月之前是社会化的窗口期,和婴幼儿一样,相当于孩子8岁左右的阶段。婴幼儿在1~2岁左右就要经常出门看看外面的世界,对于狗狗来说也是一样的。但是狗狗没有接种完疫苗怎么办呢,我们可以把幼犬抱出去,或者借助婴儿车(虽然有点怪怪的……),避免它去地上接触其他宠物的粪便和其他有害菌群。每次出去十分钟~十五分钟就可以啦。狗狗在幼犬时期良。防恶意抓取,请查看原文,,真格学网提供内容。在wait和notify搭配使用的过程中,注意需要把它们锁定到同一个资源上(例如对象a),即:
一个线程中synchronized(a),并在同步块中执行a.wait()
另一个线程中synchronized(a),并在同步块中执行a.notify()
在娱乐圈影视界一线的明星片酬都很高这是大家都知道的事情,只要一个明星够红,热度足够了,那么片酬就会高的很。那么那些当红的女明星们片酬到底有多么高呢?今天就让我们来扒一扒吧。第一位:杨颖杨颖通过上了跑男之后人气大涨,现在的片酬简直就是天价啊。据知情人士爆料,杨颖拍摄《孤芳不自赏》时的片酬是8000万,8000万啊,这部戏一共62集,也就是一集130多万。这样的天价片酬甚至是有些老戏骨的一部电视剧的片。防恶意抓取,请查看原文,,真格学网提供内容。再来看一看sleep方法的使用,回答下面两个问题:
和wait比较一下,为什么sleep被设计为Thread的一个静态方法(即只让当前线程sleep)?
为什么sleep必须要传入一个时间参数,而不允许不限期地sleep?
谢邀!狗狗恐惧下楼梯,原因是下楼时有种往下栽的感觉,它不知道下去是否安全,这也是大多数狗狗的反映,主人不必太担心!我们要做的是,让狗狗克服对下楼梯的恐惧,那就要必须直面恐惧,首先将它带到楼梯处,人先下去,然后通过牵引绳给它一个力,相当于告诉它“下来,没事的宝贝”,狗狗此时恐惧到极点,主人需要更加鼓励它下来,狗狗做到了马上给奖励,抚摸鼓励!因为狗狗只要下来了发现并没有那么可怕,慢慢一次两次三次也就不。防恶意抓取,请查看原文,,真格学网提供内容。如果我前面说的你都理解了,你应该能回答这两个问题。
泉州这边福特翼虎有现金1.5万的优惠!不知道你的城市有没有!可以实地去4S问下。你只要稍微一对比你会发现新款的福特翼虎性价比确实很高!电子手刹、胎压监测等入门就有相比确实是不错的。你只要稍微一对比你会。防恶意抓取,请查看原文,,真格学网提供内容。public&class&Sleep&extends&Thread&{ &&&&&@Override&&&&&public&void&run()&{ &&&&&&&&&System.out.println(&start&); &&&&&&&&&synchronized&(this)&{&&&&&&&&&&&&&&try&{ &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&this.sleep(10000); &&&&&&&&&&&&&}&catch&(InterruptedException&e)&{ &&&&&&&&&&&&&&&&&e.printStackTrace();&&&&&&&&&&&&&&} &&&&&&&&&} &&&&&} && && &&&&&public&static&void&main(String[]&args)&{ &&&&&&&&&Thread&thread&=&new&Sleep(); &&&&&&&&&thread.start(); &&&&&&&&&try&{ &&&&&&&&&&&&&sleep(2000); &&&&&&&&&}&catch&(InterruptedException&e)&{ &&&&&&&&&} &&&&&&&&&synchronized&(thread)&{ &&&&&&&&&&&&&System.out.println(&Has&sleep()&released&the&lock!&); &&&&&&&&&&&&&thread.notify(); &&&&&&&&&} &&&&&} &}&
1、在漆渍处正反面涂清凉油少许,隔几分钟,用棉花球顺衣料的纹擦拭,会收到理想的效果。2、先用水浸湿裤子,再用清凉油或凡士林涂在有油渍的地方,过五分钟左右,用肥皂或洗衣粉按平时洗衣方法即可。3、先在污渍处滴几滴醋,再滴洗洁精一起搓,然后用水清洗,即可顺利解决。4、在衣服沾有干油漆处滴些醋,再滴上几滴洗涤灵一起搓,并马上用水清洗(如不净可再重复一次),即可除去干油漆。5、用风油精去衣物油漆,衣物不小心沾上油漆,在油漆出滴上风油精,搓几次,然后用水清洗,即可顺利解决。。防恶意抓取,请查看原文,,真格学网提供内容。在这个JDK版本中,引入线程变量ThreadLocal这个类:
选择幼儿园确实是家长对于孩子教育第一次面临的选择。关于这个第一次,不同家庭侧重点不同,做出的选择也不一样。我觉得关键还是要权衡自己看重哪一点。1.距离近接送方便距离有时候确实会制约一定的选择机会。如果。防恶意抓取,请查看原文,,真格学网提供内容。
每一个线程都挂载了一个ThreadLocalMap。ThreadLocal这个类的使用很有意思,get方法没有key传入,原因就在于这个 key就是当前你使用的这个ThreadLocal它自己。ThreadLocal的对象生命周期可以伴随着整个线程的生命周期。因此,倘若在线程变量里存放持续增长的对象(最常见是一个不受良好管理的map),很容易导致内存泄露。
59岁好莱坞喜剧演员亚历克·鲍德温的小***HilariaBaldwin是一名瑜伽教练喜欢在社交网站晒生活点滴2014年11月因在Ins中上传她用瑜伽姿势做各种事情的照片而走红下面看看瑜伽狂妻的日常如何做家务如何带娃标准示范做家务带娃(宠物也算娃)如何虐狗如何给生活增加情趣这样做的后果就是美美美这样的老婆大家都想要一打可惜只有一个MAX呼吁姬友们无处不瑜伽无时不健身给广大肌友们创造多一些这种老婆。防恶意抓取,请查看原文,,真格学网提供内容。public&class&ThreadLocalUsage&extends&Thread&{ &&&&&public&User&user&=&new&User(); && &&&&&public&User&getUser()&{ &&&&&&&&&return& &&&&&} && &&&&&@Override&&&&&public&void&run()&{ &&&&&&&&&this.user.set(&var1&); && &&&&&&&&&while&(true)&{ &&&&&&&&&&&&&try&{ &&&&&&&&&&&&&&&&&sleep(1000); &&&&&&&&&&&&&}&catch&(InterruptedException&e)&{ &&&&&&&&&&&&&} &&&&&&&&&&&&&System.out.println(this.user.get()); &&&&&&&&&} &&&&&} && &&&&&public&static&void&main(String[]&args)&{ && &&&&&&&&&ThreadLocalUsage&thread&=&new&ThreadLocalUsage(); &&&&&&&&&thread.start(); && &&&&&&&&&try&{ &&&&&&&&&&&&&sleep(4000); &&&&&&&&&}&catch&(InterruptedException&e)&{ &&&&&&&&&} && &&&&&&&&&thread.user.set(&var2&); && &&&&&} &} && &class&User&{ && &&&&&private&static&ThreadLocal&Object&&enclosure&=&new&ThreadLocal&Object&();&&& &&&&&public&void&set(Object&object)&{ &&&&&&&&&enclosure.set(object); &&&&&} && &&&&&public&Object&get()&{ &&&&&&&&&return&enclosure.get(); &&&&&} &}&
我写过一篇文章《唯一没有中断文明历史的中国,却不是外国人旅游的首选之地》,写这篇文章完全因为一个欧洲朋友的提问:为什么那么多人不愿意到中国旅游?应该可以很完美的解答这个问题!就语言文字来说中国确实是一个没有中断历史的国家,虽然现在还有争议说古印度的历史比中华文明还要长久,只可惜古印度人的文字至今无人能懂,没有文字自然也不存在什么传承!那么,作为四大文明古国唯一没有中断历史的中国,历史人文以及山水景色几乎可以说在全球都是绝无仅有的,为什么来中国旅游的外国人这么少呢?这几乎可以算一个课题了,小编就从简单表面的一些观点去阐述,欢迎大家拍砖!曾经香港《某华早报》“用食品和厕所一样脏”来形容中国旅游业,。防恶意抓取,请查看原文,,真格学网提供内容。上面的例子会一直打印var1,而不会打印var2,就是因为不同线程中的ThreadLocal是互相独立的。
通常情况下,一般的夫妻之间不宜分居,更不宜过长,因为正常人总需要夫妻生活啊,不仅是生理方面,还有心理方面,精神方面也需要啊,况且一个正常的家庭,男女有各自的粗细分工啊,少不了的总需要人手啊,想一想都不。防恶意抓取,请查看原文,,真格学网提供内容。用jstack工具可以找到锁相关的信息,如果线程占有锁,但是由于执行到wait方法时处于wait状态暂时释放了锁,会打印waiting on的信息:
现在的小学生哪能望啊,太疯狂了。早恋早恋指的是青春期青少年建立恋爱关系。“早恋”一词只在中国内地被广泛使用。早恋一般指未进入大学阶段的青少年之间发生的爱情,特别是在校的中小学生为多。经过二十年在中国的。防恶意抓取,请查看原文,,真格学网提供内容。&Thread-0&&prio=6&tid=0x02bc4400&nid=0xef44&in&Object.wait()&[0x02f0f000] &&&&java.lang.Thread.State:&WAITING&(on&object&monitor) &&&&&&&&&at&java.lang.Object.wait(Native&Method) &&&&&&&&&-&waiting&on&&0x22a7c3b8&&(a&Wait) &&&&&&&&&at&java.lang.Object.wait(Object.java:485) &&&&&&&&&at&Wait.run(Wait.java:8) &&&&&&&&&-&locked&&0x22a7c3b8&&(a&Wait)&
朋友六年前花三千买的边牧,黑白的很漂亮,当初养时对它是百般宠爱,后来自己的宝宝诞生了就成天将它关在储藏间,我每次去就说朋友不该将它关着,朋友说要不你带走去养,我带回家养了一星期,我去上班它就一直吠叫,直到我回来它才住嘴,邻居对我很是不满,都劝我要我不要***,尽管舍不得我还是将它又送回去了,如今它又被关在那个黑暗的房子里,我很内疚,但是很无奈,看它如今脏成什么样了,郁闷……。防恶意抓取,请查看原文,,真格学网提供内容。如果程序持续占有某个锁(例如sleep方法在sleep期间不会释放锁),会打印locked的信息:
首先这个问题确实多次拿出来讨论了,看了看下面的水军简直无语,恨不得说这车不好,他们得弄死你,这款车1.8的质量好,这没有毛病,但是2.0L变速箱问题太多了,主要就是异响、顿挫,这款车其他方面配置什么的。防恶意抓取,请查看原文,,真格学网提供内容。&Thread-0&&prio=6&tid=0x02baa800&nid=0x1ea4&waiting&on&condition&[0x02f0f000] &&&&java.lang.Thread.State:&TIMED_WAITING&(sleeping) &&&&&&&&&at&java.lang.Thread.sleep(Native&Method) &&&&&&&&&at&Wait.run(Wait.java:8) &&&&&&&&&-&locked&&0x22a7c398&&(a&Wait)&
新世纪以来,在审美趣味上,我们与八九十年代的“代沟”越来越大:音乐舞台上,“杨钰莹式”温婉甜润的歌声美则美矣,但更吸引人眼球的似乎是李宇春般拥有帅气外形和中性声线的歌手;电视荧屏中,硬汉风格的男演员固然有自己的粉丝群,但那些五官清秀、外形俊朗的“新生代”似乎更受欢迎。日常生活中,许多女生都在努力成为“女汉子”,而不少男生更愿意充当“暖男”和“男闺蜜”角色。  不知不觉中,“中性”一词对我们而言已经不再陌生,“中性美”已然是目前发展迅猛的审美潮流。然而,多数人对“中性”的理解其实并不准确。“中性”并非单指女性在外形和气质上的男性化,也不必非得像尤金尼德斯的小说《中性》中的主人公一样,同时拥有两性。防恶意抓取,请查看原文,,真格学网提供内容。而如果是线程希望进入某同步块,而在等待锁的释放,会打印waiting to的信息:
在《爸爸去哪儿》首播时曾曝光了各个萌娃家庭的住宅,而号称“科技中心”的林志颖,却只在镜头前呈现了kimi琳琅满目堆满玩具的房间,乍一眼看去,传说中的高科技豪宅竟与普通家庭相差无几。但作为台湾某科技公司。防恶意抓取,请查看原文,,真格学网提供内容。&main&&prio=6&tid=0x&nid=0xf984&waiting&for&monitor&entry&[0x] &&&&java.lang.Thread.State:&BLOCKED&(on&object&monitor) &&&&&&&&&at&Wait.main(Wait.java:23) &&&&&&&&&-&waiting&to&lock&&0x22a7c398&&(a&Wait)&
在2002年4月发布的JDK1.4中,正式引入了NIO。JDK在原有标准IO的基础上,提供了一组多路复用IO的解决方案。
通过在一个Selector上挂接多个Channel,通过统一的轮询线程检测,每当有数据到达,触发***事件,将事件分发出去,而不是让每一个channel长期消耗阻塞一个线程等待数据流到达。所以,只有在对资源争夺剧烈的高并发场景下,才能见到NIO的明显优势。
相较于面向流的传统方式这种面向块的访问方式会丢失一些简易性和灵活性。下面给出一个NIO接口读取文件的简单例子(仅示意用):
import&java.io.FileInputS &import&java.io.IOE &import&java.nio.ByteB &import&java.nio.channels.FileC && &public&class&NIO&{ && &&&&&public&static&void&nioRead(String&file)&throws&IOException&{ &&&&&&&&&FileInputStream&in&=&new&FileInputStream(file); &&&&&&&&&FileChannel&channel&=&in.getChannel(); && &&&&&&&&&ByteBuffer&buffer&=&ByteBuffer.allocate(1024); &&&&&&&&&channel.read(buffer); &&&&&&&&&byte[]&b&=&buffer.array(); &&&&&&&&&System.out.println(new&String(b)); &&&&&&&&&channel.close(); &&&&&} &}&
2004年9月起JDK 1.5发布,并正式更名到5.0。有个笑话说,软件行业有句话,叫做&不要用3.0版本以下的软件&,意思是说版本太小的话往往软件质量不过关&&但是按照这种说法,JDK的原有版本命名方式得要到啥时候才有3.0啊,于是1.4以后通过版本命名方式的改变直接升到5.0了。
JDK 5.0不只是版本号命名方式变更那么简单,对于多线程编程来说,这里发生了两个重大事件,JSR 133和JSR 166的正式发布。
JSR 133重新明确了Java内存模型,事实上,在这之前,常见的内存模型包括连续一致性内存模型和先行发生模型。
对于连续一致性模型来说,程序执行的顺序和代码上显示的顺序是完全一致的。这对于现代多核,并且指令执行优化的CPU来说,是很难保证的。而且,顺序一致性的保证将JVM对代码的运行期优化严重限制住了。
但是JSR 133指定的先行发生(Happens-before)使得执行指令的顺序变得灵活:
在同一个线程里面,按照代码执行的顺序(也就是代码语义的顺序),前一个操作先于后面一个操作发生
对一个monitor对象的解锁操作先于后续对同一个monitor对象的锁操作
对volatile字段的写操作先于后面的对此字段的读操作
对线程的start操作(调用线程对象的start()方法)先于这个线程的其他任何操作
一个线程中所有的操作先于其他任何线程在此线程上调用 join()方法
如果A操作优先于B,B操作优先于C,那么A操作优先于C
而在内存分配上,将每个线程各自的工作内存(甚至包括)从主存中独立出来,更是给JVM大量的空间来优化线程内指令的执行。主存中的变量可以被拷贝到线程的工作内存中去单独执行,在执行结束后,结果可以在某个时间刷回主存:
但是,怎样来保证各个线程之间数据的一致性?JLS给的办法就是,默认情况下,不能保证任意时刻的数据一致性,但是通过对 synchronized、volatile和final这几个语义被增强的关键字的使用,可以做到数据一致性。要解释这个问题,不如看一看经典的 DCL(Double Check Lock)问题:
public&class&DoubleCheckLock&{ &&&&&private&volatile&static&DoubleCheckLock&&&&&&&private&final&Element&element&=&new&Element();&&& &&&&&private&DoubleCheckLock()&{ &&&&&} && &&&&&public&static&DoubleCheckLock&getInstance()&{ &&&&&&&&&if&(null&==&instance) &&&&&&&&&&&&&synchronized&(DoubleCheckLock.class)&{ &&&&&&&&&&&&&&&&&if&(null&==&instance) &&&&&&&&&&&&&&&&&&&&&instance&=&new&DoubleCheckLock(); &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&} && &&&&&&&&&return& &&&&&} && &&&&&public&Element&getElement()&{ &&&&&&&&&return& &&&&&} && &} && &class&Element&{ &&&&&public&String&name&=&new&String(&abc&); &}&
在上面这个例子中,如果不对instance声明的地方使用volatile关键字,JVM将不能保证getInstance方法获取到的 instance是一个完整的、正确的instance,而volatile关键字保证了instance的可见性,即能够保证获取到当时真实的 instance对象。
但是问题没有那么简单,对于上例中的element而言,如果没有volatile和final修饰,element里的name也无法在前文所述的instance返回给外部时的可见性。如果element是不可变对象,使用final也可以保证它在构造方法调用后的可见性。
对于volatile的效果,很多人都希望有一段简短的代码能够看到,使用volatile和不使用volatile的情况下执行结果的差别。可惜这其实并不好找。这里我给出这样一个不甚严格的例子:
public&class&Volatile&{ && &&&&&public&static&void&main(String[]&args)&{ &&&&&&&&&final&Volatile&volObj&=&new&Volatile(); &&&&&&&&&Thread&t2&=&new&Thread()&{ &&&&&&&&&&&&&public&void&run()&{ &&&&&&&&&&&&&&&&&while&(true)&{ &&&&&&&&&&&&&&&&&&&&&volObj.check(); &&&&&&&&&&&&&&&&&} &&&&&&&&&&&&&} &&&&&&&&&}; &&&&&&&&&t2.start(); &&&&&&&&&Thread&t1&=&new&Thread()&{ &&&&&&&&&&&&&public&void&run()&{ &&&&&&&&&&&&&&&&&while&(true)&{ &&&&&&&&&&&&&&&&&&&&&volObj.swap(); &&&&&&&&&&&&&&&&&} &&&&&&&&&&&&&} &&&&&&&&&}; &&&&&&&&&t1.start(); &&&&&} && &&&&&boolean&boolV&& &&&&&public&void&check()&{ &&&&&&&&&if&(boolValue&==&!boolValue) &&&&&&&&&&&&&System.out.println(&WTF!&); &&&&&} && &&&&&public&void&swap()&{ &&&&&&&&&try&{ &&&&&&&&&&&&&Thread.sleep(100); &&&&&&&&&}&catch&(InterruptedException&e)&{ &&&&&&&&&&&&&e.printStackTrace(); &&&&&&&&&} &&&&&&&&&boolValue&=&!boolV &&&&&} && &}&
代码中存在两个线程,一个线程通过一个死循环不断在变换boolValue的取值;另一个线程每100毫秒执行 &boolValue==!boolValue&,这行代码会取两次boolValue,可以想象的是,有一定概率会出现这两次取boolValue结果不一致的情况,那么这个时候就会打印&WTF!&。
但是,上面的情况是对boolValue使用volatile修饰保证其可见性的情况下出现的,如果不对boolValue使用volatile修饰,运行时就一次不会出现(起码在我的电脑上)打印&WTF!&的情形,换句话说,这反而是不太正常的,我无法猜测JVM做了什么操作,基本上唯一可以确定的是,没有用volatile修饰的时候,boolValue在获取的时候,并不能总取到最真实的值。
JSR 166的贡献就是引入了java.util.concurrent这个包。前面曾经讲解过AtomicXXX类这种原子类型,内部实现保证其原子性的其实是通过一个compareAndSet(x,y)方法(CAS),而这个方法追踪到最底层,是通过CPU的一个单独的指令来实现的。这个方法所做的事情,就是保证在某变量取值为x的情况下,将取值x替换为y。在这个过程中,并没有任何加锁的行为,所以一般它的性能要比使用synchronized高。
Lock-free算法就是基于CAS来实现原子化&set&的方式,通常有这样两种形式:
import&java.util.concurrent.atomic.AtomicI && &public&class&LockFree&{ &&&&&private&AtomicInteger&max&=&new&AtomicInteger(); && &&&&&&&&&&public&void&setA(int&value)&{ &&&&&&&&&while&(true)&{&&&&&&&&&&&&&&int¤tValue&=&max.get(); &&&&&&&&&&&&&if&(value&&¤tValue)&{ &&&&&&&&&&&&&&&&&if&(pareAndSet(currentValue,&value))&&&&&&&&&&&&&&&&&&&&&&break;&&&&&&&&&&&&&&}&else&&&&&&&&&&&&&&&&&break; &&&&&&&&&} &&&&&} && &&&&&&&&&&public&void&setB(int&value)&{ &&&&&&&&&int¤tV &&&&&&&&&do&{&&&&&&&&&&&&&¤tValue&=&max.get(); &&&&&&&&&&&&&if&(value&&=¤tValue) &&&&&&&&&&&&&&&&&break;&&&&&&&&&&}&while&(!pareAndSet(currentValue,&value));&&&&&&} &}&
不过,对CAS的使用并不总是正确的,比如ABA问题。我用下面这样一个栈的例子来说明:
线程t1先查看了一下栈的情况,发现栈里面有A、B两个元素,栈顶是A,这是它所期望的,它现在很想用CAS的方法把A pop出去。
这时候线程t2来了,它pop出A、B,又push一个C进去,再把A push回去,这时候栈里面存放了A、C两个元素,栈顶还是A。
t1开始使用CAS:pareAndSet(A,B),把A pop出去了,栈里就剩下B了,可是这时候其实已经发生了错误,因为C丢失了。
为什么会发生这样的错误?因为对t1来说,它两次都查看到栈顶的A,以为期间没有发生变化,而实际上呢?实际上已经发生了变化,C进来、B出去了,但是t1它只看栈顶是A,它并不知道曾经发生了什么。
那么,有什么办法可以解决这个问题呢?
最常见的办法是使用一个计数器,对这个栈只要有任何的变化,就触发计数器+1,t1在要查看A的状态,不如看一下计数器的情况,如果计数器没有变化,说明期间没有别人动过这个栈。JDK 5.0里面提供的AtomicStampedReference就是起这个用的。
使用immutable对象的拷贝(比如CopyOnWrite)也可以实现无锁状态下的并发访问。举一个简单的例子,比如有这样一个链表,每一个节点包含两个值,现在我要把中间一个节点(2,3)替换成(4,5),不使用同步的话,我可以这样实现:
构建一个新的节点连到节点(4,6)上,再将原有(1,1)到(2,3)的指针指向替换成(1,1)到(4,5)的指向。
除了这两者,还有很多不用同步来实现原子操作的方法,比如我曾经介绍过的Peterson算法。
以下这个表格显示了JDK 5.0涉及到的常用容器:
unsafe这一列的容器都是JDK之前版本有的,且非线程安全的;
synchronized这一列的容器都是JDK之前版本有的,且通过synchronized的关键字同步方式来保证线程安全的;
concurrent pkg一列的容器都是并发包新加入的容器,都是线程安全,但是都没有使用同步来实现线程安全。
再说一下对于线程池的支持。在说线程池之前,得明确一下Future的概念。Future也是JDK 5.0新增的类,是一个用来整合同步和异步的结果对象。一个异步任务的执行通过Future对象立即返回,如果你期望以同步方式获取结果,只需要调用它的 get方法,直到结果取得才会返回给你,否则线程会一直hang在那里。Future可以看做是JDK为了它的线程模型做的一个部分修复,因为程序员以往在考虑多线程的时候,并不能够以面向对象的思路去完成它,而不得不考虑很多面向线程的行为,但是Future和后面要讲到的Barrier等类,可以让这些特定情况下,程序员可以从繁重的线程思维中解脱出来。把线程控制的部分和业务逻辑的部***耦开。
import&java.util.concurrent.C &import&java.util.concurrent.ExecutionE &import&java.util.concurrent.ExecutorS &import&java.util.concurrent.E &import&java.util.concurrent.F && &public&class&FutureUsage&{ && &&&&&public&static&void&main(String[]&args)&{ &&&&&&&&&ExecutorService&executor&=&Executors.newSingleThreadExecutor(); && &&&&&&&&&Callable&Object&&task&=&new&Callable&Object&()&{ &&&&&&&&&&&&&public&Object&call()&throws&Exception&{ && &&&&&&&&&&&&&&&&&Thread.sleep(4000); && &&&&&&&&&&&&&&&&&Object&result&=&&finished&; &&&&&&&&&&&&&&&&&return& &&&&&&&&&&&&&} &&&&&&&&&}; && &&&&&&&&&Future&Object&&future&=&executor.submit(task); &&&&&&&&&System.out.println(&task&submitted&); && &&&&&&&&&try&{ &&&&&&&&&&&&&System.out.println(future.get()); &&&&&&&&&}&catch&(InterruptedException&e)&{ &&&&&&&&&}&catch&(ExecutionException&e)&{ &&&&&&&&&} && &&&&&&&&&&&&&&} &}&
上面的代码是一个最简单的线程池使用的例子,线程池接受提交上来的任务,分配给池中的线程去执行。对于任务压力的情况,JDK中一个功能完备的线程池具备这样的优先级处理策略:
请求到来首先交给coreSize内的常驻线程执行
如果coreSize的线程全忙,任务被放到队列里面
如果队列放满了,会新增线程,直到达到maxSize
如果还是处理不过来,会把一个异常扔到RejectedExecutionHandler中去,用户可以自己设定这种情况下的最终处理策略
对于大于coreSize而小于maxSize的那些线程,空闲了keepAliveTime后,会被销毁。观察上面说的优先级顺序可以看到,假如说给ExecutorService一个无限长的队列,比如LinkedBlockingQueue,那么maxSize&coreSize就是没有意义的。
JDK 6.0对锁做了一些优化,比如锁自旋、锁消除、锁合并、轻量级锁、所偏向等。在这里不一一介绍,但是给一个例子以有感性认识:
import&java.util.V && &public&class&LockElimination&{ &&&&&public&String&getStr()&{ &&&&&&&&&Vector&v&=&new&Vector(); &&&&&&&&&v.add(3); &&&&&&&&&v.add(4); &&&&&&&&&return&v.toString(); &&&&&} &&&&&& &&&&&public&static&void&main(String[]&args)&{ &&&&&&&&&System.out.println(new&LockElimination().getStr()); &&&&&} &}&
在这个例子中,对vector的加锁完全是没有必要的,这样的锁是可以被优化消除的。
CyclicBarrier是JDK 6.0新增的一个用于流程控制的类,这个类可以保证多个任务在并行执行都完成的情况下,再统一执行下一步操作:
上面这个例子就模拟了,两个子任务(分别执行2000毫秒和4000毫秒)完成以后,再执行一个总任务(2000毫秒)并打印完成。
还有一个类似的类是CountDownLatch(使用倒数计数的方式),这样的类出现标志着,JDK对并发的设计已经逐步由微观转向宏观了,开始逐步重视并发程序流程,甚至是框架上的设计,这样的思路我们会在下文的JDK 7.0中继续看到。
import&java.util.concurrent.BrokenBarrierE &import&java.util.concurrent.CyclicB && &public&class&BarrierUsage&extends&Thread&{ &&&&&private&static&CyclicBarrier&barrier&=&new&CyclicBarrier(2,&new&Thread()&{ &&&&&&&&&public&void&run()&{ &&&&&&&&&&&&&try&{ &&&&&&&&&&&&&&&&&Thread.sleep(2000); &&&&&&&&&&&&&}&catch&(InterruptedException&e)&{ &&&&&&&&&&&&&} &&&&&&&&&&&&&System.out.println(&finish&); &&&&&&&&&}; &&&&&}); && &&&&&private&final&int&sleepMilS && &&&&&public&BarrierUsage(int&sleepMilSecs)&{ &&&&&&&&&this.sleepMilSecs&=&sleepMilS &&&&&} && &&&&&@Override&&&&&public&void&run()&{ &&&&&&&&&try&{ &&&&&&&&&&&&&Thread.sleep(sleepMilSecs); &&&&&&&&&&&&&System.out.println(sleepMilSecs&+&&&secs&slept&); &&&&&&&&&&&&&barrier.await(); &&&&&&&&&}&catch&(InterruptedException&e)&{ &&&&&&&&&}&catch&(BrokenBarrierException&e)&{ &&&&&&&&&} &&&&&} && &&&&&public&static&void&main(String[]&args)&{ &&&&&&&&&new&BarrierUsage(2000).start(); &&&&&&&&&new&BarrierUsage(4000).start(); &&&&&} &}&
2011年的JDK 7.0进一步完善了并发流程控制的功能,比如fork-join框架:
把任务***成不同子任务完成;比如Phaser这个类,整合了CyclicBarrier和CountDownLatch两个类的功能,但是提供了动态修改依赖目标的能力;还有NIO2的新开放特性。这里不详细介绍了。
Java的未来
在多线程编程方面,Java的未来会怎样?
JDK 8.0按计划将在2013年夏天发布,Java从动态语言那里学了很多过来,比如闭包等等,在多线程方面会怎样呢?郁于JLS所限,无法有大的突破,还是有另辟蹊径的办法?纵观整个Java发展的历程,都在努力修正多线程模型实现上的种种弊端,尽可能在保留虚拟机优化特性的基础上给使用者屏蔽细节。
在来回想一下Java最基础的线程模型,其他语言是怎样实现的呢?
比如C#,任何类的任何方法,都可以成为线程的执行方法:
using&S &using&System.T && &public&class&AnyClass&{ &&&&&public&void&DoSth()&{ &&&&&&&&&&Console.WriteLine(&working&); &&&&&} &} && &class&ThreadTest{ &&&&&public&static&void&Main()&{ &&&&&&&&&AnyClass&anyClass&=&new&AnyClass(); &&&&&&&&&ThreadStart&threadDelegate&=&new&ThreadStart(anyClass.DoSth); &&&&&&&&&Thread&myThread&=&new&Thread(threadDelegate); &&&&&&&&&& &&&&&&&&&myThread.Start(); &&&&&} &}&
上面的AnyClass的DoSth方法,就模拟线程执行打印了一句话。
再来看一门小众语言Io,在语法糖的帮助下,实现更加简单:
thread&:=&Object&clone &thread&start&:=&method(&working&&println) &thread&@@start&
因为Io是基于原型的语言(如果你有兴趣的话,可以在我的blog里找到Io介绍),通过这样的@符号,就实现了新启一个线程运行的功能。
再来看看JDK 5.0的ReentrantLock类,它完全实现了synchronized语义上的全部功能,并且还能具备诸如条件锁、锁超时、公平锁等等更优越的特性(特别值得一提的是tryLock的功能也实现了,就是说可以判定假如这个时间获取锁是否能够成功),甚至在并发量居高不下时,性能还更加优越&&我不禁要问,用一个Java实现的锁类去从功能上代替一个已有的同步关键字,这岂不是Java自己在抽自己嘴巴?
import&java.util.concurrent.locks.ReentrantL && &public&class&ReentrantLockUsage&implements&Runnable&{ && &&&&&private&static&ReentrantLock&lock&=&new&ReentrantLock(); && &&&&&@Override&&&&&public&void&run()&{ &&&&&&&&&lock.lock(); && &&&&&&&&&try&{ &&&&&&&&&&&&&System.out.println(&do&something&1&); &&&&&&&&&&&&&Thread.sleep(2000); &&&&&&&&&}&catch&(InterruptedException&e)&{ &&&&&&&&&}&finally&{ &&&&&&&&&&&&&lock.unlock();&&&&&&&&&&} && &&&&&&&&&System.out.println(&finish&1&); &&&&&} && &&&&&public&static&void&main(String[]&args)&{ &&&&&&&&&new&Thread(new&ReentrantLockUsage()).start(); &&&&&&&&&lock.lock(); && &&&&&&&&&try&{ &&&&&&&&&&&&&System.out.println(&do&something&2&); &&&&&&&&&&&&&Thread.sleep(2000); &&&&&&&&&}&catch&(InterruptedException&e)&{ &&&&&&&&&}&finally&{ &&&&&&&&&&&&&lock.unlock(); &&&&&&&&&} && &&&&&&&&&System.out.println(&finish&2&); &&&&&} &}&
其实这个问题渊源已久,JLS在最初把Java锁机制(包括synchronized关键字)定得太死,以至于无法在上面做进一步的修正和优化,无奈只好另外重新建一个类来做这些未竟的事情。如果让Jame Gosling重新回到二十多年前,他也许会选择不同的实现。
关于协程(coroutine)。很多语言都内置了对协程的实现(协程的含义请自行查阅维基百科),听起来似乎是一个崭新的名字,但是其实这个概念一点都不新,JavaScript引擎对单个页面的解析就是通过协程的方式在一个线程内完成的。协程的实现困难有两点,一个是异常的处理,一个是出入线程时现场(包括堆栈)的保存和设置。有一些开源库已经有了Java上协程的实现,如果你感兴趣的话,不妨关注Kilim和Coroutine for Java。
最后,让我们来回顾一下Java多线程发展的历史。从Java诞生到如今有二十年了,可未来会怎样,又谁知道呢?
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&jinnianshilongnian回复:
一、我觉得非原子性的++操作这句话有点模糊,如下所示:
1、nonAtomicCounter++; 不是原子的原因是因为它是静态/实例变量,需要 读/操作/写对象成员变量。可以加把锁保证读/操作/写原子性
synchronized(atomicCounter) {
&nonAtomicCounter++;
2、如果nonAtomicCounter++; 是局部变量 仅有一条指令 iinc i,1;但局部变量又不会线程不安全;
3、nonAtomicCounter如果是long(64位)的在32位机器即使是局部变量也是线程不安全的(四火补充:在64位机器上也不是线程安全的);
4、Atomic&&&等类通过Unsafe的compareAndSwap&&& 即CAS完成的。
应该是使用成员变量的++时。
二、对于文中这段话:
但是,上面的情况是对boolValue使用volatile修饰保证其可见性的情况下出现的,如果不对boolValue使用 volatile修饰,运行时就一次不会出现(起码在我的电脑上)打印&WTF!&的情形,换句话说,这反而是不太正常的,我无法猜测JVM做了什么操作,基本上唯一可以确定的是,没有用volatile修饰的时候,boolValue在获取的时候,并不能总取到最真实的值。
这个应该是工作内存 和 主内存 同步的问题。 用volatile修饰的变量,线程在每次使用变量的时候,都会读取变量修改后的最的值。
但[boolValue == !boolValue] 和 check/swap 操作并不是原子操作。
也可以通过 在check/swap的两个boolValue加锁来保证同步
synchronized(this)&{ &&&&&&&&boolValue&=&!boolV &&}&
三、对于DCL问题那段代码,网上也有文章说即使使用volatile也不能保证DCL的安全性:
/developerworks/java/library/j-dcl/index.html
四、说明:
你给的ibm那个文章链接也说到,&The memory model allows what is known as &out-of-order writes& and is a prime reason why this idiom fails.& 所以根因在于out of order writes,引起的问题是&partially initialized&,但是文章里面提到使用volatile不能解决问题的原因在于一些JVM的实现并不能保证顺序一致性,换句话说,对于 happens-before守则并没有严格遵守,且不说他的说法是否有根据,我谈论这个问题的时候一定是在JLS明确规定以下进行的。至于虚拟机实现上的问题,我不得而知。
http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html#dcl
http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html
另外对于element前面如果不加volatile/final的话,也不能保证解决DCL问题,这里四火做一个说明:
在于instance的可见性由volatile保证了,可是element的name并没有任何语义上的保证,这里可以使用 volatile,但是对于不可变对象其实也可以使用在这里语义弱一些的final,也是可以解决问题的,JSR133对这两个关键字的语义做了强化,我上面给的链接里面也提到了,&the values assigned to the final fields in the constructor will be visible to all other threads without synchronization&。
感谢讨论。
原文链接:http://www.raychase.net/?p=698java中怎么增加多个标签?问:为什么这样做不行的为什么只有地点出来,之前的那两个label去哪里了?...答:你添加到同一个位置了,只有最后添加的可以看到。可以设置为FlowLayout现在是java用的多,还是C语言用的多答:首先,C语言是面向过程的语言,执行效率高;Java是面向对象的语言,执行效率比C语言低。C语言最关键的是比Java多了指针,这也说明了Java的健壮性,还有Java的多线程机制使程序可以并行运行,Java程序多用于网络。C语言的安全性不如Java,C语言没...java中如何继承多个父类,如何实现多个接口?答:class类implements接口1,接口2,...class子类extends父类父类只能继承一个,java不允许多重继承。当然,可以使用内部类或其他方式间接实现多重继承。
本文相关:

参考资料

 

随机推荐