文章目录
Synchronized
每个Java对象多可以用作一个实现同步的锁,这些锁称为内置锁。线程进入同步代码块或方法的时候会自动获得该锁,在退出同步代码块或方法时会释放该锁。获得内置锁的唯一途径就是进入这个锁的同步代码块或方法。
Java内置锁是互斥锁,只能有一个线程获得该锁,当锁被线程持有时,其他线程如果需要进入该方法则进入等待状态。
Java内置锁是可重入锁,即当获得该锁的线程执行中可再次进入该方法,即递归。
synchronized可以修饰方法或者以同步块的形式来进行使用,它主要确保多个线程在同一时刻,只能有一个线程处于方法或者同步块中,它保证了线程对变量的访问的可见性和排他性,又称为内置锁机制。
对象锁:Java对象锁和类锁在锁的概念上基本上和内置锁是一致的,对象锁用于对象实例方法,或者一个对象实例上的。
类锁:类锁是用于类的静态方法或者一个类的class对象上的。
每个类只有一个class对象,可以有很多个对象实例,所以不同对象实例的对象锁是互不干扰的,但是每个类只有一个类锁。
类锁只是一个概念上的东西,并不是真实存在的,类锁其实锁的是每个类的对应的class对象。类锁和对象锁之间也是互不干扰的。
/**
*对象锁
*/
public class SynTest {
private int count=0;
private Object obj=new Object();
/*同步代码块*/
private void inc1(){
synchronized (obj){
count++;
}
}
/*同步方法*/
private synchronized void inc2(){
count++;
}
/*锁当前实例*/
private void inc3(){
synchronized (this){
count++;
}
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
}
/**
*类锁
*/
public class SynTest {
private int count=0;
private Object obj=new Object();
//锁SynTest.class
private void inc4(){
synchronized (SynTest.class){
count++;
}
}
//锁当前Class对象
static synchronized void inc5(){
//...
}
}
锁Integer对象失败的原因