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