不能轻易去锁,导致线程排队,变慢了,导致down机
@RestController
public class StatController {
static Integer c= 0;
synchronized void _add() throws InterruptedException {
Thread.sleep(100);
c++;
}
@RequestMapping("/stat")
public Integer stat(){
return c;
}
@RequestMapping("/add")
public Integer add() throws InterruptedException {
_add();
return 1;
}
}
@RestController
public class StatController {
// static HashMap<Thread,Val<Integer>> map = new HashMap<>();
static HashSet<Val<Integer>> set = new HashSet<>();
synchronized static void addSet(Val<Integer> v){
set.add(v);
}
static ThreadLocal<Val<Integer>> c = new ThreadLocal<Val<Integer>>(){
@Override
protected Val<Integer> initialValue() {
Val<Integer> v= new Val<>();
v.set(0);
addSet(v);
return v;
}
};
synchronized void _add() throws InterruptedException {
Thread.sleep(100);
Val<Integer> v= c.get();
v.set(v.get() + 1);
}
@RequestMapping("/stat")
public Integer stat(){
return set.stream().map(x -> x.get()).reduce((a,x) -> a+x).get();//a 代表基类值 ,x为每一项值
}
@RequestMapping("/add")
public Integer add() throws InterruptedException {
_add();
return 1;
}
}
静态类和静态方法
如果一个类要被声明为static的,只有一种情况,就是静态内部类。
静态内部类实际上与普通类(即类名必须与文件名一样的顶级类)一样,只是静态内部类在某一类的内部定义了而已,既然是类,要想使用就必须实例化。概念上与静态变量、静态方法是不一样的,不要被“静态”两个字迷惑了(不要以为凡是静态的东西就不需要实例化就可以直接使用,静态内部类是有区别),而且只有静态内部类,而没有静态类(顶级类)的概念。