1.ThreadLocal 解决多个线程访问一个对象
ThreadLocal<Object> tl= new ThreadLocal<Object>();
tl.set(object); //object绑定到本地线程
tl.get(); //获取该线程下的对象变量
tl.remove(); //移除操作
ThreadLocal实现机制:
Map<ThreadName,Object> mMap = HashMap<String,Object>() // HashMap自己内部实现的
set(Object){
String tName = Thread.getCurrentThread().getName();
mMap.put(tName,object);
}
.....其他操作以此类推
2. volatile 目的多个线程访问中维持一个变量,不准许每个线程持有自己的变量。用来修饰变量
3.synchronized 同步锁,阻塞式。修饰方法,代码块
1) 修饰在非静态方法前,叫做对象锁
class A{
public synchronized void a(){
Thread.sleep(5*1000);
}
public synchronized void b(){
Thread.sleep(5*1000);
}
}
A a = new A();
Thread tA = new Thead(){
run(){
a.a();
}
}
Thread tB = new Thead(){
run(){
a.b();
}
}
tA.start();
tB.start();
}
上述是对象锁代码,tB会被阻塞住需要tA完全执行完毕,tB才能得到执行
2) 修饰在静态方法前,叫做类锁
class A{
public static synchronized void a(){
Thread.sleep(5*1000);
}
public static synchronized void b(){
Thread.sleep(5*1000);
}
}
Thread tA = new Thead(){
run(){
A.a();
}
}
Thread tB = new Thead(){
run(){
A.b();
}
}
tA.start();
tB.start();
上述是类锁代码实例,tB会被阻塞住需要tA完全执行完毕,tB才能得到执行
对象锁和类锁之间相互之间不受影响
4.Atomic 原子操作类,通过算法实现非阻塞式解决高并发多线程访问同一变量的问题。使用场景,序列号生成。性能和效率优秀于阻塞式
AtomicInteger aInt = new AtomicInteger(defaultVal);
int r = aInt.getAndIncrement();