Stack
局部变量,参数放在stack上(先进后出队列,队列的位置始终已知)
其他变量放在heap上
void foo() {
A a = new A();
}a的地址是在Stack上的,它的内容是放在heap上的
注意:
垃圾回收会暂停当前所有线程进行回收
垃圾回收基本步骤:
暂停程序
标记所有不可回收的对象
释放所有可回收对象
恢复程序运行
young generation(一个eden space 2个survivor space),,一个old generation,一个permanent generation
JVM初始heap大小以及最大heap大小,线程stack大小影响程序性能和稳定性
并行
进程 一个自包含的运行环境
线程 轻量级的进程
Java中的并行
通过Thread实现 继承thread并重写run方法实现
通过executor实现
通过实现runnable
public class HelloRunnable implements Runnable {
• public void run() {
• System.out.println("Hello from a thread!");
• }
• public static void main(String args[]) {
• (new Thread(new HelloRunnable())).start();
• }
• }多线程引入:
使用synchronized
同步方法,在方法名称前加synchronized关键字,整个方法同步,即每个方法每次都只有一个线程进入
使用synchronized块,对方法中的一个区域进行同步
引入多线程会发生死锁:两个线程互相等待
并行引入的新问题:
死锁:保证以相同的顺序进入锁定区域.进入锁定区后不再加锁
饥饿:由于一个线程霸占了资源,其他线程不发获取资源 通过加入wait notify 等方法使线程暂时退出资源
高级并行对象
Lock 比synchronize更加灵活的方式
在lock之后,用try/catch块,并把unlock方法放在finally里面
读写锁可以支持一个读写队列的实现
Executor:可以看做一个线程池Executor以及ExecutorService支持Runnable对象以及其他方式运行线程
可以比线程池更加灵活的操作
原子变量:
可以通过synchronized或者lock实现对一个简单类型读写等操作线程锁定但是,java.util.concurrent.atomic包中提供了更加便捷的方式,其运行效率高于synchronized
















