zoukankan      html  css  js  c++  java
  • 线程安全理解

    一.线程安全示意图

     其中锁1,锁2表示该对象对应的类中某些具有锁功能的代码块,方法等。

    如果锁1,锁2都是传统锁(synchronized)的话,

    线程1.线程2,线程3,线程4,线程5之间都是互斥的,任何一个线程在执行,其他的线程都在等待。

    二.线程安全的检测

    在程序中,当一个类在没有做锁处理的情况,它的实例被多个线程共享时,就会可能存在线程安全问题。

    分析的一般步骤的思路(也有其他特殊情况),作为参考:

    第一步:在类的构造方法加上打印日志语句

    第二步:在类的方法都加上 System.out.println(Thread.currentThread().getName());

    第三步:  启动主线程,或者其他操作触发多线程(如web项目,我们一个请求就是触发一个线程)

    第四步:  分析类的构造方法上日志是否打印一遍,而类的方法上日志打印多遍,且线程名称存在不同。这就是说明多个线程对同一个对象进行操作。

    第五步:考虑线程安全,是否需要对这些方法(或者方法里的代码块)进行加锁处理。哪里加锁,加什么样的锁,锁的粒度等等,这样就需要根据具体

                  情况具体分析,然后结合多线程的知识,测试的情况进行完善。

    如果是多个线程共同调用同一个静态方法,那么如果考虑到线程安全就要用该类的字节码(****.class)作为锁来使用。

  • 相关阅读:
    石子合并之一
    最长公共子序列
    最长上升子序列
    剑圣的逃跑
    方格取数
    数字三角形
    Omkar and Last Class of Math
    IDEA中对代码进行测试
    Spark(一)【spark-3.0安装和入门】
    HTTP请求 Java API
  • 原文地址:https://www.cnblogs.com/lipengsheng-javaweb/p/12519319.html
Copyright © 2011-2022 走看看