java多线程学习之二——多线程的优势和风险
优势:
1、 提高系统的吞吐率。多线程编程使得一个进程中可以有多个并发的操作。例如:一个线程因为I/O操作而处于等待时,其他线程仍然可以执行其操作。
2、 提高响应性。使用多线程编程的情况下,对于GUI软件(桌面应用程序)而言,一个慢的操作并不会导致软件的界面出现被“冻住”的现象而无法响应其他用户的其他操作。
3、 充分利用多核CPU资源。避免资源浪费。
4、 最小化对系统资源的使用。一个进程中的多个线程可以共享其所在进程所申请的资源。
5、 简化程序的结构。
6、多线程是异步的。
风险:
1、 线程安全问题。多个线程共享数据的时候,如果没有采取相应的并发访问措施,那么就会产生数据一致性的问题,如读取脏数据(过期的数据)、丢失更新(更新被覆盖)等。
2、 线程的生命特征问题。代码编写不适当可能导致某些线程一直处于等待其他线程释放锁的状态,即产生了死锁。例如:线程T1拥有锁L1,并试图去获得锁L2,而此时线程T2用户拥有锁L2而试图是获得锁L1,这就导致线程T1和T2一直处于等待对方释放锁而一直又得不到的状态。等等。
3、 上下文切换。多线程编程的必然副产物,增加了系统的消耗,不利于系统的吞吐率。
4、 可靠性。一方面有利于可靠性,例如:某个线程意外终止了,但这并不影响其他线程继续其处理。另一方面,线程是进程的一个组件,它总是存在于特定的进程中的,如果这个进程由于某种原因意外提前终止了,比如某个java进程由于内存泄漏导致JVM崩溃,那么该进程中的所有线程也就随之而无法继续运行。
多线程有风险,用之需谨慎!
参考:
《java多线程编程实战指南》黄文海
所有发生在我们身上的事件都是一个经过仔细包装的礼物。只要我们愿意面对它有时候有点丑恶的包装,带着耐心和勇气一点一点的拆开包装的话,我们会惊喜的看到里面珍藏的礼物。
----遇见未知的自己