类中的static方法,多个线程调用会不会有线程安全问题

时间:2022-09-11 13:10:40
比如:class Test{
public static hello(String name ){
System.out.println(name);
}

多个钱程同时调用,name变量是不是不能保证线程安全性

12 个解决方案

#1


没有问题呀,name是作为参数传进来的,根本没有线程问题,和static无关

#2


不存在共享对象,不会有安全问题

#3


sword_hero (sword) 引起了我的注意:
如果是:
class Test{
private static name;

private changename() {
//些处改变了name
}

public static hello(){
changename()
System.out.println(name);
}
}

结果会怎么样呢?

#4


看你这个name是作什么用的了,要是计数器就该同步,要不然,逻辑上也是允许的吧

#5


sword_hero (sword) 引起了我的注意:
如果是:
class Test{
private static name;

private changename() {
//些处改变了name
}

public static hello(){
changename()
System.out.println(name);
}
}

结果会怎么样呢?

--------------------
结果会很混乱.呵呵

#6


那时不是说 java在处理调用static方法时,还是初始化了一个对象

#7


对你的问题不是很明确,但是静态方法还是会存在多线程问题的。
这里介绍一下类级别锁,看对你有没有什么帮助。

对象的每个实例,除了存在对象级别锁,还存在类级别锁,它锁定类的所有实例的共享。

synchronized语句也是可以使用类级别锁的。
例如:
public static synchronized void staticA(){
   ...
}

也可以使用如下代码锁定类类级别锁
public static void staticB(){
   synchronized(ClassName.class){     //注意一定要有.class的扩展名,否则就是对象级别锁了
     ...
   }
}

#8


如果变量或对象在函数中发生改变,则有可能出现问题。

#9


只是读数据的话,应该不存在这个问题,但是如果有线程改变变量的值,如果不进行同步的话,会出现问题。

#10


把 访问name的代码同步应该可以吧。。。

Object obj=new Object(); 
     
synchronized(obj){

  System.out.println(name);
}

#11


不会,不同线程有不同的方法栈.

#12


好象不会,因为 String  是不 变类型。。。

#1


没有问题呀,name是作为参数传进来的,根本没有线程问题,和static无关

#2


不存在共享对象,不会有安全问题

#3


sword_hero (sword) 引起了我的注意:
如果是:
class Test{
private static name;

private changename() {
//些处改变了name
}

public static hello(){
changename()
System.out.println(name);
}
}

结果会怎么样呢?

#4


看你这个name是作什么用的了,要是计数器就该同步,要不然,逻辑上也是允许的吧

#5


sword_hero (sword) 引起了我的注意:
如果是:
class Test{
private static name;

private changename() {
//些处改变了name
}

public static hello(){
changename()
System.out.println(name);
}
}

结果会怎么样呢?

--------------------
结果会很混乱.呵呵

#6


那时不是说 java在处理调用static方法时,还是初始化了一个对象

#7


对你的问题不是很明确,但是静态方法还是会存在多线程问题的。
这里介绍一下类级别锁,看对你有没有什么帮助。

对象的每个实例,除了存在对象级别锁,还存在类级别锁,它锁定类的所有实例的共享。

synchronized语句也是可以使用类级别锁的。
例如:
public static synchronized void staticA(){
   ...
}

也可以使用如下代码锁定类类级别锁
public static void staticB(){
   synchronized(ClassName.class){     //注意一定要有.class的扩展名,否则就是对象级别锁了
     ...
   }
}

#8


如果变量或对象在函数中发生改变,则有可能出现问题。

#9


只是读数据的话,应该不存在这个问题,但是如果有线程改变变量的值,如果不进行同步的话,会出现问题。

#10


把 访问name的代码同步应该可以吧。。。

Object obj=new Object(); 
     
synchronized(obj){

  System.out.println(name);
}

#11


不会,不同线程有不同的方法栈.

#12


好象不会,因为 String  是不 变类型。。。