上代码
public class TestAtomicInteger {
static int i = 0 ; //error!
public static void main(String[] args) throws Exception{
Thread[] ts = new Thread[10];
for(int k = 0 ; k<ts.length ; k++){
ts[k] = new Thread(new Runnable(){
public void run() {
for (int k = 1; k <= 10000; k++) {
i++;
}
}
});
ts[k].start();
}
for(int k=0; k <ts.length ; k++){
ts[k].join();
}
System.out.println(i);
}
}
执行结果
原因分析 计存器
public class TestAtomicIntegerTest {
static int i = 0 ; //error!
static Integer a=Integer.valueOf(0);
public static void main(String[] args) throws Exception{
Thread[] ts = new Thread[10];
for(int k = 0 ; k<ts.length ; k++){
ts[k] = new Thread(new Runnable(){
public void run() {
for (int k = 1; k <= 10000; k++) {
i++;
synchronized (a){ //加锁失败 锁的不是同一个对象,每次都对b对象赋值,每次都是新的b对象,因此锁的不是同一个对象
a=Integer.valueOf(a.intValue()+1); //还是int值操作 最终还是整数操作(这个说法可以参考)
}
}
}
});
ts[k].start();
}
for(int k=0; k <ts.length ; k++){
ts[k].join();
}
System.out.println(i);
System.out.println(a);
}
}
执行结果
public class TestAtomicIntegerTestData {
static int i = 0 ; //error!
static AtomicInteger a = new AtomicInteger(0); //无锁算法 比较交换算法 cas算法
static Integer b = Integer.valueOf(0);//error!
static MyObject obj = new MyObject();
public static void main(String[] args) throws Exception{
Thread[] ts = new Thread[10];
for(int k = 0 ; k<ts.length ; k++){
ts[k] = new Thread(new Runnable(){
public void run(){
for(int k = 1 ; k <= 10000; k++){
i++;
a.incrementAndGet(); //无锁算法 cas算法 比较交换算法 推荐使用
synchronized(b){
b = Integer.valueOf(b.intValue()+1);
}
synchronized(obj){ //不推荐使用 千军万马过独木桥
obj.x++;
}
}
}
});
ts[k].start();
}
for(int k=0; k <ts.length ; k++){
ts[k].join();
}
System.out.println(i);
System.out.println(b);
System.out.println(a);
System.out.println(obj.x);
}
}
class MyObject{
public int x=0;
}
执行结果
这辈子坚持与不坚持都不可怕,怕的是独自走在坚持的道路上!!!