线程安全,就这么简单

原创 2005年04月29日 09:33:00

版权声明:如有转载请求,请注明出处:http://blog.csdn.net/yzhz 杨争

1、什么是线程安全(thread safe)?
        一个类要成为线程安全的类,就是在该类被多个线程访问时,不管运行环境中执行这些线程有什么样的时序安排或者交错,它仍然执行正确行为,并且在调用的代码中没有任何额外的同步。

2、什么时候考虑线程安全问题?
       当一个类的实例为singleton的时候,你就要考虑该实例在调用的时候是否是线程安全的。
       最熟悉的例子就是servlet, 每个servlet在servlet engineer中只有一个实例。除非它实现SingleThreaded接口。所以我们一般要求在servlet中不要定义成员变量,以避免线程不安全。
       是不是凡是singleton的对象都不是线程安全的呢?答案是No。准确的表达应该是:只有该类中定义了有状态的成员时该类才是线程不安全的
举个例子:
public class A{
    String id ;
    public void process(){
       print(id);
       ...
    }
}
       id是一个有状态的变量。什么是有状态,就是指每次调用该类的时候如果该id值可能存在不同的值,那么这个id就是有状态的。

我们再看看下面的例子。
public class B{
    public void process(){
     int i;
     int j;
          
     println(i*y);
    }
}
        这个class B在单实例的情况下就是线程安全的。原因是:该类没有有状态的成员。i,j是局部变量,某个线程都会有自己的stack保存这些局部变量。所以对于不同线程来说,这些变量是相互不影响的。

        对于存在线程不安全的类,如何避免出现线程安全问题呢?
1、采用synchronized同步。缺点就是存在堵塞问题。
2、使用ThreadLocal(实际上就是一个HashMap),这样不同的线程维护自己的对象,线程之间相互不干扰。

总结:
1、我们一般要求商业逻辑的BO为线程安全的类,这样就可以将该BO创建成一个单实例的对象,提高访问的效率。为了使BO为线程安全的对象,我们所要做的很简单,就是该类中不要有与状态相关的成员变量。

java的内存机制以及servlet中的线程安全问题简单理解

Java 把内存划分成两种:一种是栈内存,另一种是堆内存。在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配,当在一段代码块定义一个变量时,Java 就在栈中为这个变量分配内存...

[原创][Java]一个简单高效的线程安全队列的JAVA实现

package twolocksample; import java.util.concurrent.ExecutorService; import java.util.concurrent.Exe...
  • zaozi
  • zaozi
  • 2014年08月28日 13:39
  • 1352

Java之线程安全的简单理解

只为简单易懂,便于理解并在实际中用到: 当多个线程访问某个状态变量并且只要有一个变量执行写入操作时,必须采用同步机制来协同这些线程对变量的访问。Java主要的同步机制是关键字synchroniz...

黑马程序员——多线程--线程的创建方式和线程安全的简单介绍

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- Java多线程 一、线程的介绍 线程的概念: 正在进行中的程序为进程,而线程就是进程中的内容...

使用ping钥匙临时开启SSH:22端口,实现远程安全SSH登录管理就这么简单

转载自:http://www.cnblogs.com/martinzhang/p/5348769.html 设置防火墙策略时,关于SSH:22访问权限,我们常常会设置服务器只接受某个固定IP...

一个简单的Java对象池实现——可用来解决SimpleDateFormat的线程安全问题

被SimpleDateFormat的线程安全问题困扰过的人应该不止我一个吧。为了比秒这个类的线程安全,通常我们会有以下两种做法: 每次都new 一个SimpleDateFormat对象,但频繁的创建与...
  • nmgrd
  • nmgrd
  • 2016年06月17日 17:55
  • 1755

delphi非常简单的线程安全队列

在开发项目中,经常会遇到多线程操作,此时肯定需要一个线程安全的队列,我一直在用这个,是大牛写的 unit MyQueue; interface {$DEFINE ...

可重入和线程安全简单介绍

可重入和线程安全 可重入和线程安全这两个术语,经常出现在计算机编程中,用于指明类和函数在多线程程序中的使用。 可重入:若一个程序或子程序可以“安全的被并行执行(Parallel computing...

自定义圆形进度控件(线程安全)

  • 2015年06月10日 19:24
  • 1.61MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:线程安全,就这么简单
举报原因:
原因补充:

(最多只允许输入30个字)