HEAD
详见前面内存管理:静态变量在方法区;局部变量在栈内存;实例变量在堆内存 =======
详见前面内存管理:静态变量在方法区;局部变量在栈内存;实例变量在堆内存
>>>>>>> 593e4ea (添加了SSM)
栈可能有多个,有主栈也有分支栈,不同的栈不共享局部变量,局部变量不存在线程安全问题 而方法区、堆内存是所有线程共享的,所以静态变量和实例变量可能出现线程安全问题,一句话,成员变量可能出现线程安全问题
补充:常量不会遇到线程安全问题
框住类的方法的局部,被框柱的叫同步代码块。这是效率最高的,也是最常用的
写在实例方法上,适合于共享对象就是 this 的情况。优点是简洁,代码少。缺点:范围大了点,执行效率较低
public synchronized void 等... 方法名(方法参数列表){
...
}
上面的框实例方法已经很少用,本方法更是仅在理论层面探讨 框柱线程的局部(比如框柱调用方法的代码片段,则整个类方法执行时都是一个整体。注意这时不写 this,因为这时 this 是线程对象,并不是共享对象了)
写在静态方法上,锁的就是类。类锁永远只有 1 把,与类创建了多少个实例对象无关。
对象锁用来保护实例变量的安全 类锁用来保护静态变量的安全
非线程安全的集合 | 线程安全的集合 | |
---|---|---|
ArrayList | Vector | 大小可调的数组 |
HashMap, HashSet | ConcurrentHashMap | 基于哈希表的集合/映射实现 |
现在 HashMap 继承的是 Map,而以前 Hashtable 是继承陈旧的 Dictionary 类的)
← 死锁 wait方法和notify方法→ <<<<<<< HEAD