Java采用多线程的方式来处理大量的并发请求,在这个情况下,程序的复杂程度远高于单线程时,尤其在多核和多cpu情况下,最明显的问题是线程之间共同管理的资源竞争和线程间的交互操作。
- 线程资源同步机制:
在Java中,i++操作不是线程安全的
上面的内容和Java内存模型有关:
由Java内存模型能看出来,一个简单的i++操作,实际上在内存中的步骤并不简单,每一个线程都有一个工作内存,当它需要操作主内存的变量时,并不像代码中写的那么简单,包含了一系列步骤。
为了解决这种问题,jvm提供了synchronized关键字、volatile关键字、lock/unlock机制。
对于使用lock unlock时避免死锁,一定要保证这俩操作成对出现。
线程交互机制:
这里需要注意notify和notifyAll的区别,notify是随机唤醒,另一个是唤醒所有线程。
线程状态及分析:
Jvm将线程分为几个不同的状态,并放在不同的sets中进行调度。
值得一提的是,jdk提供了一些开源工具让用户在程序运行的时候对线程进行监控和分析,具体什么工具前面也有提到,需要在实际开发环境中进行实践。这些工具可以在开发过程中让我们对程序有更好的监控和调度以及寻找问题的途径,是解决问题的好工具。