线程同步机制

线程安全问题
多线程访问了共享数据,会产生线程安全问题。
解决线程安全问题的第一种方案:使用同步代码块
格式:synchronized(锁对象){
可能会出现线程安全的代码(访问了共享数据的代码)
}
注意:
(1)通过代码块的锁对象,可以使用任意的对象。
(2)但是必须保证多个线程使用的锁对象是同一个
(3)锁对象作用:把同步代码块锁住,只让一个线程在同步代码块中执行

同步中的线程,没有执行完毕不会释放锁,同步外的线程没有锁进不去同步。
同步保证了只能有一个线程在同步中执行共享数据,保证了安全,但程序频繁的判断锁,获取锁,释放锁,程序的效率会降低。
解决线程的第二种方案:使用同步方法
使用步骤:
(1)把访问了共享数据的代码抽取出来,放到一个方法中
(2)在方法上添加synchronized修饰符
格式:定义方法的格式
修饰符 synchronized 返回值类型 方法名(参数列表){
可能会出现线程安全的代码(访问了共享数据的代码)
}

静态的同步方法的锁对象是本类的class属性-->class文件对象(反射)
解决线程的第三种方案:Lock锁
java.util.concurrent.locks.Lock接口
Lock实现提供了比使用synchronized方法和语句可获得的更广泛的锁定操作。
Lock接口中的方法:
void lock()获取锁
void unlock()释放锁
java.util.concurrent.locks.ReentrantLock implements lock 接口
使用步骤:
(1)在成员位置创建一个ReentrantLock对象
(2)在可能会出现安全问题的代码前调用Lock接口中的方法lock获取锁
(3)在可能会出现安全问题的代码后调用Lock接口中的方法unlock释放锁

你可能感兴趣的:(线程同步机制)