Q1:下面这个方法中的变量x是否线程安全呢?
public static void method() {
int x = 0;
for(int i = 1;i<=10;i++) {
x *= i;
}
System.out.println(x);
}
A:答案是安全的,当多个线程同时执行此方法时,每个线程都会产生一个自己的变量x,每个线程之间互不干扰,不会对其他线程的变量x有影响。
Q2:如果x是一个静态变量,那变量x是否还线程安全呢?
A:当变脸x是一个静态变量时,多个线程执行此方法时,每个方法都会读取这个变量,在操作完成后写回x中。相对这些线程来说,变量x是共享的。如果不对它进行保护,那么就存在线程安全问题。
Q3:下面这个方法中的对象sb是否线程安全?
public static void method(StringBuilder sb) {
sb.append(1);
sb.append(2);
System.out.println(sb.toString());
}
A:在这里sb对象是作为参数传入的,这意味着它并不是线程私有的,多个线程都可以同时访问它。所以不是线程安全的。
Q4:这个方法中的对象sb又是否线程安全的呢?
public static StringBuilder method() {
StringBuilder sb = new StringBuilder();
sb.append(1);
sb.append(2);
return sb;
}
A:不是线程安全的。虽然sb对象是在方法内生成的对象。但是sb作为一个返回变量返回,其他线程可以去拿取它,对它进行并发的操作。