synchornized关键字
1. synchornized相关问题
锁的目的是让多个线程竞争同一个锁。有竞争关系就是安全的,没有就是不安全的。
- 两个线程同时访问同一个对象的同步方法 (安全)
同一个对象的同步方法,即修饰的是普通方法,锁的是对象实例,两个线程访问时,一个线程使用对象的同步方法即该线程获取了对象的锁,也就是当前对象是不能够给其他线程使用的,值到当前线程释放该对象,其他线程才能进行访问。 - 两个线程同时访问两个对象的同步方法 (不安全) test1.func1() test2.func1()
当前的两个线程访问的是两个对对象,不冲突,所以把相当于锁是失效的。 - 两个线程同时访问(一个或两个)对象的静态同步方法 (安全)
- 两个线程分别同时访问(一个或两个)对象的同步方法和非同步方法 (不安全)
- 两个线程访问同一个对象中的同步方法,同步方法又调用另外一个非同步方法 (不安全)
- 两个线程同时访问同一个对象的不同的同步方法 (安全)
- 两个线程同时访问静态synchronized和非静态synchornized方法 (不安全)
2.synchronized的使用方法
1.可以修饰代码块:锁代码块
第一种:同步代码块
灵活
synchronized(线程共享对象){
同步代码块;
}
2.可以修饰普通方法:锁当前对象
第二种:在实例方法上使用synchronized
表示共享对象一定是this
并且同步代码块是整个方法体。
3.可以修饰静态方法:锁类
第三种:在静态方法上使用synchronized
表示找类锁。
类锁永远只有1把。
就算创建了100个对象,那类锁也只有一把。
对象锁:1个对象1把锁,100个对象100把锁。
类锁:100个对象,也可能只是1把类锁。