线程交互

2018-12-30  本文已影响34人  若兮缘

线程安全

概述:在多个线程同时运行时发生的异常情况统称为线程安全问题
产生:线程随机访问性、有多个线程并行、多个线程有共享数据、多个线程操作了共享数据
处理:使用java提供的同步机制,使某一线程的完整动作执行完毕,其他线程再进行操作
争用条件:
Race Condition,当多个线程同时共享访问同一数据(内存区域)时,每个线程都尝试操作该数据,
从而导致数据被破坏(corrupted),这种现象称为争用条件

线程交互方式

互斥:同一时间只能有一个线程去操作临界区的关键数据,使用synchronized(intrinsic lock) 实现
同步:线程间的通信机制,相当于上班时快递员打电话通知你去拿快递,使用 wait()/notify()/notifyAll() 实现
Wait Set集合:
第一个线程,获得锁lock资源,进入临界区Critical Section,由于某些条件不满足进入wait状态,
释放锁资源,放置在Wait Set中。
后面的线程可以正常执行临界区逻辑,执行完毕后可以调用notify()随机唤醒一个在wait set中的线程
可以调用notifyAll()唤醒当前锁对象所有在等待的线程
通信机制:
因为多个线程争抢cpu资源,可能会造成数据的破坏,因此可通过线程锁即synchronized(同步的)关键字配合wait方法来
过滤掉不满足条件的线程,使这些线程保持休眠状态直到被重新唤醒,而满足条件的线程继续执行,执行完毕后,通过
notify()/notifyAll()方法唤醒处于睡眠状态的线程,重新竞争资源,然后再次通过线程锁重新筛选,循环往复!

Java同步机制

原子性操作:
在执行操作时,我们把一个完整动作可以称为一个原子性操作,是一个不可切割的动作。即不可被线程打断的操作
锁对象:
几个线程需要使用相同的锁对象进行同步操作,使用不同的锁是无法完成同步操作的,锁对象可以是任意数据类型的任意对象
synchronized关键字:
同步关键字可以确保共享对象(锁对象)在同一时刻只能被一个线程访问
Synchronized可以修饰成员方法,静态方法,代码(语句)块
同步代码块格式:
synchronized(锁对象){ //该对象可以是任意对象
需要同步的代码;
}
Synchronized内需要同步的代码即为一个原子性操作
同步方法:方法上声明,将所在对象作为默认锁,即this public Synchronized void xxx(){}
同步静态方法: 将方法所在类作为默认锁,即XX.class public static Synchronized void xxx(){}
synchronized优缺点:
优点: 解决了多线程安全问题
缺点: 当线程相当多时,因为每个线程都会去判断同步上的锁,这是很耗费资源的,无形中会降低程序的运行效率。
对于一个简单操作,单线程速度更快
Lock锁:
Lock锁同样可以完成代码同步的任务,比synchronized方式操作更为灵活,无需使用限制性强的代码块
Lock为抽象类,需要使用其子类ReentrantLock的对象完成方法调用
方法: public void lock() 获取锁,上锁
public void unlock() 释放锁,开锁

上一篇 下一篇

猜你喜欢

热点阅读