写这篇博客的目的是因为网上众多的资料采用大篇幅文字介绍这个东西,感觉很枯燥,故而自己参考了被人的博客,微信文章总结了这篇文章,尽量减少各种名词的使用,有错误之处还望告知,虚心接受
-
synchronized的使用
-
1.作为java的内置关键字,其获取锁与释放锁由jvm控制,无需考虑因代码异常而无法释放锁
- 2.属于互斥锁(某个时刻仅允许一个线程访问)
- 3.分为对象锁 类锁
- 3.1 class锁 作用在类上 对于 所有的对象某个时刻只允许一个线程访问该方法
//1.静态方法同步
public static synchronized void add(int value){
doSomthing...
}
//2.静态方法中的同步块
public static add(){
synchronized(Test.class){
doSomething..
}
3.2 对象锁 作用在对象上 对于同一个对象某个时刻只允许一个时刻访问该方法
//1.实例方法同步
public synchronized int get() {
doSomthing...
}
//2.实例方法同步块
public add(){
synchronized(this){
doSomething..
}
3.3总结
3.3.1. 本质上线程访问synchronized 方法实际上就是获取锁,同一把锁每个是个只允许一个线程访问,如果各个方法上的锁不一致的话,各个方法是可以并发执行的。
3.3.2. synchronized 同步块最好不要用String类型 因为会出现字符串常量池的问题,导致可能本意是控制单个实例,结果导致控制所有的对象示例
3.3.3. 考虑一个场景 在一个类的多个方法上加了相同的锁 如果某个方法涉及执行io操作,需要花费很长时间,这样会导致其余线程不能执行其余方法,可以考虑单独加锁
4. 优点:操作简单,不需要考虑因为异常而导致无法释放锁
5. 缺点:粒度太宽,具体在下章讲解lock时作对比