线程安全-----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   此关键字使用的时候, 应该把同步  区域尽可能的缩小,主要针对那些可变的状态变量。

原文地址:https://www.cnblogs.com/09120912zhang/p/10313338.html