美文网首页
线程交互

线程交互

作者: 若兮缘 | 来源:发表于2018-12-30 22:24 被阅读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() 释放锁,开锁

相关文章

  • 7.3java线程深度解析:线程的交互

    线程交互式一个很复杂的问题 一.线程交互的基础知识 线程交互知识点需要从java.lang.Object的类的三个...

  • 线程交互

    (1)在线程中停止另一个线程 thread.stop(); 强制停止 (不安全) 由于stop的时候线程可能处于...

  • 线程交互

    线程交互的基础知识 首先看下java.lang.Object的类的三个方法: void notify()唤醒此对象...

  • 线程交互

    线程安全 概述:在多个线程同时运行时发生的异常情况统称为线程安全问题产生:线程随机访问性、有多个线程并行、多个线程...

  • Android线程与消息机制

    OUTLINE §UI线程 §Looper §消息机制 §线程交互 §AsyncTask §Activity/Se...

  • 线程间通信原理及Android多线程

    线程间交互 一个线程启动别的线程:new Thread().start()、Executor.execute() ...

  • 2019-01-25 零碎复习

    线程交互的几种方式 线程启动, A 启动 B, 线程终结, 不要用 Stop , 用 Interrupt 线程的等...

  • Java自学-多线程 交互

    Java 线程之间的交互 wait和notify 线程之间有交互通知的需求,考虑如下情况:有两个线程,处理同一个英...

  • 线程间交互和Android多线程

    线程间交互 一个线程启动另一个线程 new Thread().start() Executor.execute(...

  • Android JsBridge线程

    jsBridge线程是WebView内html与app完成js交互的线程,此线程拥有自己的ViewRootImpl...

网友评论

      本文标题:线程交互

      本文链接:https://www.haomeiwen.com/subject/xvublqtx.html