线程安全-----Synchronize的使用
主要讲synchronize两部分问题 1.可重入锁, 2.synchronize区域的合理使用。
JVM中的区域主要分为五部分
线程私有 虚拟机栈、本地方法栈、程序计数器
线程共享: java堆、方法区
所谓的线程安全针对的就是线程共享区域,从此处我们得到一个结论:无状态的类是线程安全的,因为不存在线程共享一说。
1.可重入锁: java中对于每个锁都关联一个计数值和对应的线程,初始计数值为0, 线程获取此锁,计数值+1, 线程离开此锁计数值-1.当计数值为0,其它线程才可以获取此锁。
package com.ThreadSafe; /** * 可重入锁 * 如果锁不可重入, 那么下面代码会产生死锁 * 最终锁住的对象都是子节点对象 */ public class reEntrantLock { public synchronized void doSomething() { System.out.println(this); } public static void main(String... args) { new reSonLock().doSomething(); } } class reSonLock extends reEntrantLock { public synchronized void doSomething() { System.out.println(this); super.doSomething(); } }
2. synchronize 此关键字使用的时候, 应该把同步 区域尽可能的缩小,主要针对那些可变的状态变量。