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

    一.线程安全示意图

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

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

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

    二.线程安全的检测

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

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

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

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

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

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

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

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

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

  • 相关阅读:
    讯时新闻系统再探
    三顾讯时对讯时新闻发布系统的艰难突破
    MsSQL注入猜解数据库技术
    提取中国IP段信息
    翻译杂感 via刘未鹏
    学习密度与专注力
    Cross Compilation Toolchains
    RHEL/CentOS 6.0使用第三方软件库(EPEL与RPMForge、RPMFusion软件库)
    一个很好的shell配置文件
    Cloud Computing
  • 原文地址:https://www.cnblogs.com/lipengsheng-javaweb/p/12519319.html
Copyright © 2011-2022 走看看