问一个Java死锁的问题 20
有2个线程,有A、B两个锁。定义一个整数变量i,如果i是偶数,先取A锁,再取B锁;如果i是奇数,先取B锁,再取A锁代码及运行结果如下如下,我的问题是,变量i++从0变成了...
有2个线程,有A、B两个锁。定义一个整数变量i,如果i是偶数,先取A锁,再取B锁;如果i是奇数,先取B锁,再取A锁代码及运行结果如下如下,我的问题是,变量i++从0变成了奇数1后,为什么有一个线程走了if(i%2==0)并输出了“Thread-0 i:1 if--------locka”?变量i不是奇数吗,为什么会走条件是偶数的代码呢?代码如下图运行结果:Thread-1 i:0 if--------lockaThread-1 i:0 if--------lockbi++之后的值:1Thread-0 i:1 if--------lockaThread-1 i:1 else--------lockb
展开
1个回答
展开全部
1、同步代码:线程安全 数据安全 数据完整 性能非常低。
2、非同步代码:非线程安全 数据不完整、数据重复、数据错位等 性能高。
3、死锁:过多的同步就会造成死锁。好比这样一个场景:有一天大马猴偷了二狗的女朋友,二狗偷了大马猴的儿子(多个线程对象同时同步),二狗说:你还我女朋友,我就还你儿子。大马猴说:你还我儿子,我就还你女朋友。二狗又说:你不还我女朋友,我就不还你儿子。大马猴说:你不还我儿子,我就不还你女朋友。(此时出现了死锁),有两种结果:1、等死。(内存耗尽) 2、只要有一方松开即可解这个锁。
4、解决方案:删除代码中任何一个synchronized()代码块即可。
2、非同步代码:非线程安全 数据不完整、数据重复、数据错位等 性能高。
3、死锁:过多的同步就会造成死锁。好比这样一个场景:有一天大马猴偷了二狗的女朋友,二狗偷了大马猴的儿子(多个线程对象同时同步),二狗说:你还我女朋友,我就还你儿子。大马猴说:你还我儿子,我就还你女朋友。二狗又说:你不还我女朋友,我就不还你儿子。大马猴说:你不还我儿子,我就不还你女朋友。(此时出现了死锁),有两种结果:1、等死。(内存耗尽) 2、只要有一方松开即可解这个锁。
4、解决方案:删除代码中任何一个synchronized()代码块即可。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询