[b]1.静态方法[/b]
无论是静态方法还是实例方法,在内存中都只有一份代码,也就是只占用一份内存空间
方法属于一个程序块,只有当别人调用它时才会调到内存里面去执行,也就是说当前有多少个线程在执行就有多少组方法块里的局部变量
[b]2.静态变量[/b]
只存在一份,多个线程公用一份,一个线程修改就会影响其他线程
[b]3.结论[/b]
静态方法是使用得当是线程安全的,因为每次调用会创建一份私有块,如果是静态变量是的的话就要加锁挥着其他处理。
[b]4.实例[/b]
无论是静态方法还是实例方法,在内存中都只有一份代码,也就是只占用一份内存空间
方法属于一个程序块,只有当别人调用它时才会调到内存里面去执行,也就是说当前有多少个线程在执行就有多少组方法块里的局部变量
[b]2.静态变量[/b]
只存在一份,多个线程公用一份,一个线程修改就会影响其他线程
[b]3.结论[/b]
静态方法是使用得当是线程安全的,因为每次调用会创建一份私有块,如果是静态变量是的的话就要加锁挥着其他处理。
[b]4.实例[/b]
class User{
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class StaticTest {
private static int count = 0;
private static int counts = 0;
/**
* 不会存在并发问题
*
* @return
*/
public static String getTestStr() {
String xx = Thread.currentThread().toString();
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
return xx;
}
/**
* 存不存在并发问题与传入的变量有关
* 假如thread a和thread b都在操作对象a则存在
* @param user
* @return
*/
public static String getTestUser(User user) {
String str = "id: " + user.getId() + "name: " + user.getName();
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
return str;
}
/**
* 存在并发问题
*
* @return
*/
public static int getTestCount() {
count++;
count++;
count++;
count++;
count++;
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
count++;
count++;
count++;
count++;
count++;
return count;
}
/**
* 不存在并发问题
*
* @return
*/
public synchronized static int getTestCountS() {
counts++;
counts++;
counts++;
counts++;
counts++;
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
counts++;
counts++;
counts++;
counts++;
counts++;
return counts;
}
public static void main(String[] args) {
User user = new User();
for (int i = 0 ; i < 1000 ; i++){
final int finalI = i;
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
User userTmp = new User();
user.setId(finalI);
user.setName(Thread.currentThread().toString());
userTmp.setId(finalI);
userTmp.setName(Thread.currentThread().toString());
//局部变量不存在问题
System.out.println("getTestStr: " + Thread.currentThread() + StaticTest.getTestStr());
//与user有关
System.out.println("getTestUser: " + Thread.currentThread() + StaticTest.getTestUser(user));
System.out.println("getTestUseS: " + Thread.currentThread() + StaticTest.getTestUser(userTmp));
//线程不安全
System.out.println("getTestCount: " + Thread.currentThread() + StaticTest.getTestCount() % 10);
//安全但是慢需要加锁
System.out.println("getTestCountS: " + Thread.currentThread() + StaticTest.getTestCountS() % 10);
}
});
thread.start();
}
}
}