Java虚拟机线程类型与并发的优势与风险
Java虚拟机是程序员在学习Java编程开发语言的时候需要重点掌握的一个编程技术点,而今天我们就通过案例分析来了解一下,Java虚拟机线程类型与并发的优势与风险。
1、线程栈:
每一个运行在Java虚拟机里的线程都拥有自己的线程栈。这个线程栈包含了这个线程调用的方法当前执行点相关的信息。一个线程仅能访问自己的线程栈。一个线程创建的本地变量对其它线程不可见,仅自己可见。即使两个线程执行同样的代码,这两个线程任然在在自己的线程栈中的代码来创建本地变量。因此,每个线程拥有每个本地变量的独有版本。
2、线程堆:
堆上包含在Java程序中创建的所有对象,无论是哪一个对象创建的。这包括原始类型的对象版本。如果一个对象被创建然后赋值给一个局部变量,或者用来作为另一个对象的成员变量,这个对象任然是存放在堆上。
一个本地变量如果是原始类型,那么它会被完全存储到栈区
一个本地变量也有可能是一个对象的引用,这种情况下,这个本地引用会被存储到栈中,但是对象本身仍然存储在堆区
对于一个对象的成员方法,这些方法中包含本地变量,仍需要存储在栈区,即使它们所属的对象在堆区
对于一个对象的成员变量,不管它是原始类型还是包装类型,都会被存储到堆区
Static类型的变量以及类本身相关信息都会随着类本身存储在堆区
堆中的对象可以被多线程共享。如果一个线程获得一个对象的应用,它便可访问这个对象的成员变量。如果两个线程同时调用了同一个对象的同一个方法,那么这两个线程便可同时访问这个对象的成员变量,但是对于本地变量,每个线程都会拷贝一份到自己的线程栈中
3、并发的优势与风险
优势:1)速度:使用处理多个请求,响应更快,复杂的操作可以分成多个进程同时执行2)设计:程序设计在某些情况下更简单,也可以有更多的选择3)资源利用:CPU能够在等待IO的时候做一些其他的事情
风险:1)安全性:多个线程共享数据时可能会产生于期望不相符的结果2)活跃性:某个操作无法继续进行下去时,就会发生活跃性问题。比如死锁、饥饿等问题3)性能:线程过多时会使得:CPU频繁切换,调度时间增多;同步机制;消耗过多内存