`
ray_yui
  • 浏览: 216810 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

并发编程 — 判断线程安全

    博客分类:
  • Java
阅读更多

并发编程系列文章:
      初解线程池:http://ray-yui.iteye.com/blog/2072463
      详解线程池:http://ray-yui.iteye.com/blog/2075311
      并发数据类型:http://ray-yui.iteye.com/blog/2080454
      并发数据结构:http://ray-yui.iteye.com/blog/2084202
      volatile:http://ray-yui.iteye.com/blog/2231474
      判断线程安全:http://ray-yui.iteye.com/blog/2232931
      实现线程安全:http://ray-yui.iteye.com/blog/2234688


      Java对线程的支持有如一把双刃剑,线程安全性可能是非常复杂的.在没有足够的同步情况下,多个线程中得操作执行顺序是不可预测的,甚至会发生奇怪的结果.而分辨所编写的代码/程序/类是否线程安全或代码运行结果是否一直正确,是每个多线程开发人员必须具备的能力.


      对于判断所编写的类是否线程安全,可以参考以下几个方面


1.该对象是否会被多个线程访问修改
      假如对象会被多个线程访问,例如各种的Context或Factory,如Hibernate中的SessionFactory.SessionFactory是Session的生产工厂,一般对单库应用全局只需要保持一个SessionFactory,但对其属性的修改则是可以多个线程进行修改,因此若然没有足够的加锁机制,SessionFactory是一个线程不安全的对象.


2.注意静态变量.
      请注意变量一词,由于静态变量是属于该类和该类下所有对象共享,可直接通过类名访问/修改,因此在多线程的环境下.可以断言所有对静态变量的修改都会发生线程安全问题.除非静态变量为并发容器,通过委托线程安全容器发布对象.


3.改变对象内部状态的方法调用.
      请回看第一点,当一个对象的属性会被多个线程修改时,需要进行同步操作.但并不代表不提供某属性的setter方法就可以万事安心.而真正需要关注的是,哪些内部方法的调用或对外公开的方法调用会导致对象内部属性(状态)的改变.


4.单例
      相信大家在学习编程的时候都知道懒加载单例存在线程安全问题.先检查后操作是多线程开发中一个经常大意忽略的问题.因为并行程序共享的变量无时无刻都有可能发生变化,这涉及到数据失效性的问题.而单例由于是全局唯一,所以单例对象会被所有线程所访问,而单例中的属性若然允许进行修改,则会引发线程安全问题.当对象在Spring管理下默认是Singleton,当我们在三层架构开发下.在DAO(Repository)或Service中声明全局变量并对其进行操作,同样会引发线程安全问题.


总结:
      不必要的同步会带来性能损耗,判断失误缺少同步系统将失去正确性.判断自己开发的类是否线程安全是每一个多线程开发人员的必修课.
8
2
分享到:
评论
1 楼 uniqueX 2015-08-06  
mark!

相关推荐

    Java并发编程(学习笔记).xmind

    Java并发编程 背景介绍 并发历史 必要性 进程 资源分配的最小单位 线程 CPU调度的最小单位 线程的优势 (1)如果设计正确,多线程程序可以通过提高处理器资源的利用率来提升系统吞吐率 ...

    线程安全详解及相关实用技巧(附源码)

    并发/并行编程中多线程编译占有重要的地位,编写一份线程安全的程序即使对于一名经验丰富的开发人员也是一种挑战。本文将通过详解线程安全的上的相关概念,确定出一系列的原则,帮忙多线程程序的开发人员能够容易的...

    C++11的多线程并发编程(一)

    C++11的多线程并发编程(一) 在疫情期间以及未来毕业后即将工作的憧憬中,给自己立个学习flag,学习并第一次通过CSDN记录下C++11的多线程并发编程。初学者的我写的不好,还望大家多多指正与批评, 学习多线程并发...

    C#并行编程高级教程:精通.NET 4 Parallel Extensions中文(第2部分)

    详细讲述最新的单指令、多数据流指令和向量化等并行编程技术,介绍现代并行库,讨论如何珠联璧合地使用高级Intel工具与C#,并指导您巧妙使用新引入的轻型协调结构来开发自己的解决方案并解决最棘手的并发编程问题。...

    Java高级程序设计-多线程(二).pptx

    3.1 线程安全 多线程编程时,由于系统对线程的调度具有一定的随机性,所以,使用多个线程操作同一个数据时,容易出现线程安全问题。 当多个线程访问同一个资源时,如果控制不好,也会造成数据的不正确性。 以银行取...

    Java深入核心-多线程编程实战

    因为并发编程是 Java 语言中最为晦涩的知识点,它涉及操作系统、内存、CPU、编程语言等多方面的基础能力,更为考验一个程序员的内功。本课程希望能够帮助你建立起一张处理并发问题的全景图,让你能够彻底理解Java多...

    C#并行编程高级教程:精通.NET 4 Parallel Extensions中文(第一部分)

    详细讲述最新的单指令、多数据流指令和向量化等并行编程技术,介绍现代并行库,讨论如何珠联璧合地使用高级Intel工具与C#,并指导您巧妙使用新引入的轻型协调结构来开发自己的解决方案并解决最棘手的并发编程问题。...

    C#并行编程高级教程:精通.NET 4 Parallel Extensions中文(第3部分)

    详细讲述最新的单指令、多数据流指令和向量化等并行编程技术,介绍现代并行库,讨论如何珠联璧合地使用高级Intel工具与C#,并指导您巧妙使用新引入的轻型协调结构来开发自己的解决方案并解决最棘手的并发编程问题。...

    python编程测试电脑开启最大线程数实例代码

    本文实例代码主要实现python编程测试电脑开启最大线程数,具体实现代码如下。 #!/usr/bin/env python #coding=gbk import threading import time, random, sys class Counter: def __init__(self): self.lock =...

    python 并发编程 非阻塞IO模型原理解析

    非阻塞IO(non-blocking IO) ...用户进程判断结果是一个error时,它就知道数据还没有准备好,于是用户就可以在本次到下次再发起read询问的时间间隔内做其他事情,或者直接再次发送read操作。一旦ker

    精通Windows.API-函数、接口、编程实例.pdf

    14.1.3 处理并发的客户端连接 455 14.1.4 网络通信的异步I/O模式 456 14.2 IP Helper 456 第15章 程序安装与设置 463 15.1 创建cab文件 463 15.1.1 makecab.exe 463 15.1.2 压缩多个文件 464 15.1.3 ...

    精通WindowsAPI 函数 接口 编程实例

    14.1.3 处理并发的客户端连接 455 14.1.4 网络通信的异步I/O模式 456 14.2 IP Helper 456 第15章 程序安装与设置 463 15.1 创建cab文件 463 15.1.1 makecab.exe 463 15.1.2 压缩多个文件 464 15.1.3...

    C#编程经验技巧宝典

    10 <br>0023 如何添加引用第3方控件 11 <br>0024 如何生成DLL文件 11 <br>0025 如何使用不安全代码 11 <br>第2章 语言基础 13 <br>2.1 注释 14 <br>0026 如何对代码进行注释 14 ...

    5种不同的端口扫描器程序.zip

    1.采用多线程技术能够对指定的网络主机与端口在同一时间并发进行扫描 2.采用connect扫描、半开扫描、FIN扫描三种手段实现扫描 3.结合扫描结果与/etc/services文件将网络中开启的主机及主机开启的服务在屏幕上显示...

Global site tag (gtag.js) - Google Analytics