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);
}
}
结果会怎么样呢?
如果是:
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);
}
}
结果会怎么样呢?
--------------------
结果会很混乱.呵呵
如果是:
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的扩展名,否则就是对象级别锁了
...
}
}
这里介绍一下类级别锁,看对你有没有什么帮助。
对象的每个实例,除了存在对象级别锁,还存在类级别锁,它锁定类的所有实例的共享。
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);
}
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);
}
}
结果会怎么样呢?
如果是:
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);
}
}
结果会怎么样呢?
--------------------
结果会很混乱.呵呵
如果是:
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的扩展名,否则就是对象级别锁了
...
}
}
这里介绍一下类级别锁,看对你有没有什么帮助。
对象的每个实例,除了存在对象级别锁,还存在类级别锁,它锁定类的所有实例的共享。
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);
}
Object obj=new Object();
synchronized(obj){
System.out.println(name);
}
#11
不会,不同线程有不同的方法栈.
#12
好象不会,因为 String 是不 变类型。。。