synchroized +volatile关键字

一、volatile关键字

1. volatile的作用是强制从公共堆栈中取得变量的值,而不是从线程私有数据栈中取得变量的值
2. volatile关键字增加了实例变量在多个线程之间的可见性,缺点是不支持原子性,但是sychronized可以保证原子性,也可以间接的保证可见性,是线程工作内存中的私有变量玉公共内存中的变量同步的功能。即有类似volatile的功能
3.  多线程访问volatile不会发生阻塞,但是synchronized会发生阻塞

二、synchroized


> 2.1 synchroized同步方法

 1. 多个线程对同一个对象中的实例变量进行访问,产生的后果就是脏读:即取到的数据有可能是被修改过的。
 2. 线程安全问题针对--》实例变量,针对方法内部的私有变量不存在线程安全问题。
 3. synchroized取得的锁是对象锁,如果创建多个对象的话,将无法实现同步,呈现的状态就是多个对象多个锁。
 4. synchorized在一个他的方法/块内部调用本类的其他synchroized时,是可以永远得到锁的
 5. 当存在子父类继承关系时,子类完全可以通过“可重复入锁”调用父类的同步方法
 6. 当一个线程执行的代码出现异常时,会自动的释放锁资源
 7. synchroized修饰方法时是放在public前边的
 8. synchroized的同步性是不可以继承的,意味着,如果子类继承的父类中有synchroized修饰的方法,子类重写时,如果子类中存在实例变量,调用此方法时,还是非线程安全的。

> 2.2 synchroized 同步代码块

 1. synchroized同步方法,是对当前对象加锁,但是同步执行,会影响程序的效率
 2. synchroized代码块间是具有同步性的,一个线程访问时,其他线程将处于阻塞状态,
 3. synchroized代码块可以将任意对象作为对象监视器(非this),而这个非this对象也必须是同一个,不然就变成了异步的了。
 4. synchroized关键字加到static方法上是给Class类上锁,而加到非静态的方法上是给当前对象加锁
 5. synchroized不怎么使用string类型作为锁对象,因为,string常量池具有缓存的功能

你可能感兴趣的:(java多线程编程)