在多线程中使用静态方法是否有线程安全问题

   类的成员分为两类,静态成员(static member)和实例成员(instance member)。静态成员属于类,实例成员则属于对象,即类的实例。

    简单讨论一下在一个类中使用静态字段(static field)和静态方法(static method)是否会有线程安全问题。 

    我们在知道, 静态字段(static field)和静态方法(static method)的调用是通过类来调用。静态方法不对特定的实例操作,只能访问静态成员。实例方法可对特定的实例操作,既能访问静态成员,也能访问实例成员。

    那么,在多线程中使用静态方法是否有线程安全问题?这要看静态方法是是引起线程安全问题要看在静态方法中是否使用了静态成员。

    因为,在多线程中使用同一个静态方法时,每个线程使用各自的实例字段(instance field)的副本,而共享一个静态字段(static field)。所以说,如果该静态方法不去操作一个静态成员,只在方法内部使用实例字段(instance field),不会引起安全性问题。但是,如果该静态方法操作了一个静态字段,则需要静态方法中采用互斥访问的方式进行安全处理。

 

http://blog.csdn.net/scucj/article/details/1394523

时间: 2024-09-21 11:28:45

在多线程中使用静态方法是否有线程安全问题的相关文章

实例解析Java中的synchronized关键字与线程安全问题_实用技巧

首先来回顾一下synchronized的基本使用: synchronized代码块,被修饰的代码成为同步语句块,其作用的范围是调用这个代码块的对象,我们在用synchronized关键字的时候,能缩小代码段的范围就尽量缩小,能在代码段上加同步就不要再整个方法上加同步.这叫减小锁的粒度,使代码更大程度的并发. synchronized方法,被修饰的方法成为同步方法,其作用范围是整个方法,作用对象是调用这个方法的对象. synchronized静态方法,修饰一个static静态方法,其作用范围是整个

httpruntime的cache中的dataset对象的线程安全问题

问题描述 我的数据从数据库取出来后保存在dataset中,然后将dataset保存在httpruntime的cache中去,n个用户同时访问我的cache中的dataset数据,会出现有的用户数据取出来的不完整,datasetds=httpruntime.cache["dataset"]然后循环ds的数据,会发现在循环的过程中ds的rows.count会有变化,当然这个时候有其他的用户在访问.我后来改进了一下:datasetds=httpruntime.cache["data

Java中静态方法的线程安全问题

问题描述 Java中静态方法的线程安全问题 Java中多个线程同时访问一个静态方法是否存在线程安全问题? 比如以下代码,两个线程同时对方法中b修改不同的值,会有线程安全问题吗? new Thread(new Runnable() { @Override public void run() { fun(0); } }).start(); new Thread(new Runnable() { @Override public void run() { fun(1); } }).start(); }

JavaWeb学习之Servlet(三)----Servlet的映射匹配问题、线程安全问题

一.Servlet映射匹配问题: 在第一篇文章中的第四段(MyEclipse及Tomcat的配置)已经讲到这个知识,现在再细化一下: 由于客户端是通过URL地址访问web服务器中的资源,所以Servlet程序若想被外界访问,必须把servlet程序映射到一个URL地址上,这个工作在web.xml文件中使用<servlet>元素和<servlet-mapping>元素完成. <servlet>元素用于注册Servlet,它包含有两个主要的子元素:<servlet-n

多线程问题-新手求助关于Java多线程中启动线程问题

问题描述 新手求助关于Java多线程中启动线程问题 public class Example15_1 { /** * @param args */public static void main(String[] args) { // TODO Auto-generated method stub SpeakHello speakHello; SpeakNinhao speakNinhao; speakHello = new SpeakHello(); speakNinhao= new Speak

C# 如何让 多线程中每个线程间隔毫秒执行同一个方法?

问题描述 多线程的好处让效率提高很多倍,但是在某些情况下要求操作同一个方法的时候要求有间隔,这个间隔当然是毫秒级别的否则多线程的意义就体现不出来,本问题就是怎么让多线程中每个线程间隔毫秒执行同一个方法,测试代码如下:privatevoidbtnTest_Click(objectsender,EventArgse){TestManyThreadtest=newTestManyThread();test.Start();} 主要代码如下classTestManyThread{privatestati

libssh2 多线程-libssh2在多线程中如何确保线程安全?

问题描述 libssh2在多线程中如何确保线程安全? 如题,我在csdn下载了一个别人编译好的libssh2库,但在多线程中使用的时候,总是运行一会儿就报异常说写入位置发生冲突,目前我只知道libssh2_session_init();这个函数是不安全的,多线程中需要加锁.我想请问下还有其他哪些函数是需要加锁的?只需要告诉我下面这些函数哪些需要加锁就可以了. 1.libssh2_session_set_timeout 2.libssh2_session_startup 3.libssh2_ses

linux多线程编程中如何等待过个线程退出

问题描述 linux多线程编程中如何等待过个线程退出 linux多线程编程中,如果线程A创建了线程B,我知道用pthread__ join可以令线程A 阻塞然后等待线程B的退出.如果线程A创建了三个线程B,C,D,执行完的先后顺序不知.想让A必须等待三个线程都退出后再退出,应该怎么做? 连用pthread__join三次吗???但是第一次用了pthread__join后,A不就阻塞了吗? 解决方案 多线程编程(一):线程创建和退出Linux多线程编程(创建线程)Linux多线程编程(创建线程)

服务器-java中把Socket.accept放入多线程中 如果一个客户端连入 那么会接入哪一个线程中呢

问题描述 java中把Socket.accept放入多线程中 如果一个客户端连入 那么会接入哪一个线程中呢 如题 自己测试出来是连接不到 不明白 ................... .................... 解决方案 linux C中的accept函数它的其中一个参数struct sockaddr是一个结构体,该结构体中的一个字段记录了连接上来的客户端的IP地址和端口号等信息, 你只需要访问该结构体中的这个字段就好了 accept( SOCKET s, struct sock