zoukankan      html  css  js  c++  java
  • 并发

    1.Java线程有优先级 :1~10

    static int MAX_PRIORITY:线程可以具有的最高优先级,取值为10。

    static int MIN_PRIORITY:线程可以具有的最低优先级,取值为1。

    static int NORM_PRIORITY:分配给线程的默认优先级,取值为5。

    使用: 主线程优先级为normal;优先级有继承关系,A线程中创建B线程,那么A,B同样优先级

    Thread4 t1 new Thread4("t1");

    t1.setPriority(Thread.MAX_PRIORITY);//这里设置具体数值也是可以的      getPriority可以获取线程优先级

    1.1线程睡眠         不释放锁

    sleep():使线程转为阻塞状态,当sleep结束后,转为就绪       

    1.2线程等待object中的方法         释放锁

    wait():当前线程等待,释放锁,直到其他线程调用此对象的notify()方法或notifyAll()唤醒方法,行为等价于wait(0)

    1.3线程让步        不释放锁

    yield():暂停当前正在执行的对象,把执行机会让给相同或者更高优先级的线程

    1.4线程加入

    join() :当前线程调用另一个线程的jion()方法,当前线程进入阻塞状态,直到另一个进程运行结束,当前才阻塞—>就绪

    1.5线程唤醒    

    notify()与notifyAll()   一个是唤醒一个等待的线程,一个是全部线程唤醒。

    https://blog.csdn.net/eff666/article/details/53559201

    2.join()  :等待该线程终止

    主线程启动子线程,子线程用了join方法,则join()方法后的代码需等子线程执行完才会结束回主线程执行

    不加join,主线程开始-->主线程结束-->子线程开始-->子线程结束

    加join,主线程先开始-->子线程开始-->子线程结束→主线程结束

    3.yield() 停止当前正在执行的线程对象,让步相同优先级其他线程,从运行状态→可运行状态(可能没有效果)

    4.sleep()当前线程进入停滞,这段时间未释放锁,yield()让给同优先级其他线程执行,yield()被称为“退让”

    sleep()之后,低优先级线程可获取运行机会,yield()只让同优先级

    5.interrupt()中断某个线程,一般设boolean变量来控制run方法什么时候结束,然后让线程调用interrupt()

    isAlive():判断一个线程是否存活

    activeCount():程序中活跃的线程数

    currentThread():得到当前线程

    isDaemon():一个线程是否为守护线程    守护线程必须在线程启动前调用setDaemon(true)方法       守护线程就是后台通用服务线程

    线程是有继承性的,守护线程创建的线程也是守护线程(后台线程)      setDeamon会出现不执行finally的情况

    synchronized用法:

    1. 当做方法修饰符   :同步方法,锁定的为调用这个同步方法的对象
    2. synchronized(this):与第一个相同,this代表调用这个方法的对象
    3. 同步块:
    4. synchronized作用于static:当前调用这个方法的对象所属的类获得锁

    线程传递方式:

    1. 线程的运行和结束是不可确定的,因此,传递和返回数据无法像方法 一样通过方法参数和return语句返回数据
    2. 通过构造方法传递数据
    3. 通过setName()和变量等来传递数据
    4. 通过方法回调传递数据

    继承Thread            实现多线程

    实现Runnable接口 实现多线程

    ReenTrantLock:允许尝试获取锁但最终未获取锁,这样如果其他线程获取了锁,自己就去做别的事,而不是仅仅是等待

    原子性可替换同步

    volatile:确保了应用的可视性,如果将一个域声明为volatile,那么只要对这个域产生了写操作,那么所有的读操作都可以看到这个修改(volatile域会被立即写入到主存中,而读操作就发生在主存中

    多个任务在同时访问某个域,那么这个域就应该是volatile,否则这个域就应该只能经由同步来访问。同步也会导致向主存中刷新,因此,若一个域完全由synchronized方法或语句块来防护,则不必将其设置为volatile

    原子性:

    通过使用AtomicInteger消除synchronized关键字

    临界区:::synchronized(syncObject){}  :防止多个线程同时访问方法内部的部分代码而不是访问整个方法     syncObject为获得该锁的对象,只有获得锁了才能进入同步控制块

    使用缓存锁定的方式实现原子性,

    java通过锁和循环CAS的方式来实现原子操作

    原子操作常用方法

    1. int addAndGet(int delta): 以原子方式将输入的数值与实例中的值(AtomicInteger里的value)相加,并返回结果
    2. boolean compareAndSet(int expect,int update):如果输入的值等于预期值,则以原子方式将该值设置为输入的值
    3. int getAndIncrement():以原子方式将当前值加一(返回的值为自增前的值)
    4. void lazySet(int newValue):最终会设置为newValue,使用lazySet()后,可能导致其他线程在之后的一小段时间内还是可以读到旧的值
    5. int getAndSet(int newValue):以原子方式设置为newValue的值,并返回旧值

    原子更新数组:

    1. int addAndGet(int i,int delta):以原子方式将输入值与数组中索引i的元素相加
    2. boolean compareAndSet:如果当前值等于预期值,则以原子方式将数组位置 i 的元素设置成update值

    数组value通过构造方法传递进去,然后AtomicIntegerArray会将当前数组复制一份,所以当AtomicIntegerArray对内部的数组元素进行修改时,不会影响传入的数组

    ReentrantLock类

    和synchronized关键字一样,线程间执行的顺序是随机的,一旦持有锁,则需释放锁,其他的线程才能获得

    Lock

    1. int getHoldCount()   作用为查询当前线程保持此锁定的个数,也就是调用lock方法的次数
    2. int getQueueLength()  返回正等待获取此锁定的线程估个数
    3. int getWaitQueueLength(Condition condition)  返回等待与此锁相关的给定条件Condition的线程估计数,如5个线程,每个线程都执行了同一个condition对象的await()方法,则调用getWaitQueueLength()方法时返回的int值为5
    4. boolean hasQueuedThreads(Thread thread) 查询是否有线程正在等待获取此锁定
    5. boolean hasWaiters(Candition condition)  查询是否有线程正在等待与此锁有关的condition条件
  • 相关阅读:
    12 【结构型】 浅谈享元模式的理解与使用
    11【结构型】浅谈 外观模式 理解与使用~
    【Maven基础入门】02 了解POM文件构建
    【Maven基础入门】01 Maven的安装与环境变量的配置
    02【创建型】原型模式
    01【创建型】单例模式
    10 浅谈 装饰器模式的理解与使用
    Java JDK1.8源码学习之路 2 String
    Java JDK1.8源码学习之路 1 Object
    ApachShiro 一个系统 两套验证方法-(后台管理员登录、前台App用户登录)同一接口实现、源码分析
  • 原文地址:https://www.cnblogs.com/acg88688/p/11870600.html
Copyright © 2011-2022 走看看