上下文的频繁切换,会带来一定的性能开销,所以也不是线程越多越好。
对于死锁,我们现在模拟的场景是,A抓B的头发的同时,B也抓A的头发。
我们做模拟的这个场景的demo代码:
我们要选择项目的jdk是jdk8,因为jdk8开始才可以使用lamda表达式。
运行一下看看结果:
我们发现它是正常运行的。
我们现在给它加上一个休眠时间:
控制台没有任何输出。
我们如何判断我们是否发生了死锁呢?
可以使用我们jdk给我们提供的工具。
通过jps查询到我们的端口号。
使用这个命令:
它会提示我们发生了死锁。
也可以使用这个命令:
会出现这样的一个页面。
点击对应的程序:
就可以显示我们发生的死锁。
这就是我们对死锁的初步认识。
我们可以写这样一段代码。运行:
现在我们每次线程执行一次方法都让它休眠10毫秒,再去运行:
运行不会有任何问题,但是每次运行的结果都会和咱们期望的结果有一定的差距。这是运行之前无法发现的。
这就是我们线程安全性的一个问题。