线程同步:保证多线程并发访问线程安全,对可变对象(即对象成员变量值可以改变)采取加锁,整个流程即
加锁-->修改-->释放锁。
*PS:不可变对象意味着这个对象是final的,对象中所有的公共属性是final的。同时说明这个对象是线程安全的,这意味着他们可以在多线程中使用,而不需要使用synchronization。
加锁方法
1.同步代码块
在run()的方法体内:
synchronized(obj){
}
2.同步方法
public synchronized void AnQuan(){//需要保证对某个成员变量的访问是线程安全的,可以用synchronized关键字修饰该成员变量所在方法
}
*为减少加锁带来的性能影响,应:
1.不要对线程安全类的所有方法都进行同步,只对那些会改变竞争资源(也就是共享资源)的方法进行同步。
2.
3.释放同步监视器的锁定
4.同步锁
显示定义同步锁对象来实现同步,同步锁由LOCK对象充当。
import java.util.concurrent.locks.ReentrantLock;
class x{
private final ReentrantLock lock=new ReentrantLock();
public void needLock(){ //需要加锁的方法
lock.lock();//加锁
try{//需要加锁的代码块
}
finally{
//释放锁
lock.unlock();
}
}
}
5.死锁