五、多线程中的临界资源问题以及解决方案


1.产生原因
临界资源:被多个线程同时访问的资源
如果有多个线程同时访问同一份资源,这个资源对应的值有可能会出现值不准确的情况【临界资源产生的原因:在多个线程访问同一份资源的时候,如果一个线程在取值的过程中,时间片又被其他线程抢走了,临界资源问题就产生了】

2.解决方案
当多个线程同时访问同一份资源的时候,如果其中的一个线程抢到了时间片,如果给这个资源“上一把锁“,这个时候其他剩余的线程只能在锁外面进行等待

3.锁
对象锁:任意的对象都可以充当一把锁
类锁:把任意一个类当做锁,格式:类名.class

4.使用锁来解决临界资源问题
1>同步代码块
语法:
synchronized(锁) {
//需要访问的临界资源
}
说明:
a.程序执行到了这个代码段中,就用锁锁住了临界资源,这个时候,其他的线程将不能执行代码段中的代码,只能在锁外面进行等待
b.当执行完代码段中的代码时,会自动解锁,然后剩下的线程就可以开始争抢cpu时间片
c.一定要保证不同的线程看到的是一把锁,否则解决临界资源问题没有任何意义

同步代码块和对象锁的使用
同步代码块和类锁的使用

2>同步方法
语法:
sychronized 访问权限修饰符 返回值类型 函数名(参数列表) {
//需要访问的临界资源
}

说明:
a.如果一个线程走到这个方法内部,就会用锁来锁住临界资源,其他的线程将不能进入到这个方法的内部
b.隐式锁,如果这个方法是静态方法,锁是类锁【当前类】,如果是一个非静态方法,则是一个对象锁【this】


3>显式锁【同步锁】
通过使用ReentrantLock这个类来进行锁的操作,实现了Lock接口
使用ReentrantLock来进行显式的加锁和解锁
lock():加锁
unlock():解锁

原文地址:https://www.cnblogs.com/lsp-lsp/p/7344403.html