• java多线程与锁相关


    线程五种状态:

    新建状态:首次创建线程,new Thread() 不具备其他任何状态

    就绪状态:执行start()进入就绪状态,线程已经启动,分配了cpu时间片,排队等待运行

    执行状态:获得cup资源 执行run(),没有意外直接执行到结束

    终止状态:当执行结束或调用stop() destory(),或被其他线程杀死,不能再进入就绪状态

    阻塞状态:由于某种原因,在执行状态中暂停执行,让出cpu

    sleep()进入睡眠 规定时间后自动苏醒回到就绪状态

    Wait()进入等待 需要notify(),notifyAll()回到就绪状态

    当被其他线程所阻塞,调用suspend()

    中断:

    java中断机制是一种协作机制通过一个线程去中断另一个线程(对该线程发出中断请求,该线程根据合适机会自己处理)

    线程方法:

    //线程让步

    //使线程进入暂停,让出cpu资源,直接进入就绪状态,而不是阻塞状态

    Thread.yield()

    //t.join()方法只会使主线程进入等待池并等待t线程执行完毕后才会被唤醒。并不影响同一时刻处在运行状态的其他线程。

    //比如t1.join(),必须等t1全部执行完,才能继续执行未就绪的线程,与他同时执行的不影响    

     public join()

    //线程设置优先级  MAX_PRIORITY =10  MIN_PRIORITY =1  NORM_PRIORITY =5

    t1.setPriority();

    Sychronized

    对代码块加锁:锁住的是任意对象,默认是this,(也就是说当新创建了第二个对象来访问不受限制)

    对普通方法加锁:锁住的是同一个对象,默认是this

    对静态方法加锁:锁住的是当前类的class对象,除了被锁住的静态方法受到限制,该类其余方法不受限制。

    Lock接口

    创建lock   Lock lock=new ReentrantLock();

    lock.lock();  

    解锁 lock.unlock();

    locksynchronized区别:

    1.synchronized是锁住方法体,代码块比较大的部分。Lock可以局部上锁解锁

    2.synchronizedjava的关键字,有jvm处理锁与解锁,不需要用户主动释放锁。LockJava类通过代码实现锁,需要主动释放,不释放容易出现死锁。

    3.synchronized不可中断。Lock可以中断。

    4synchronized是一种悲观锁。Lock是一种乐观锁

    5.synchronized是不公平锁。Lock默认非公平,根据传入的参数true为公平

    公平锁与非公平锁

    JavaFIFO的是公平锁。根据队列先后顺序,先申请的线程先获得锁

    非公平锁,可能出现插队情况

    可重入锁与不可重入锁

    以线程为单位,当一个线程获得对象锁之后,可再次获得该对象上的锁

    防止死锁

    可重入锁与不可重入锁对比,简单来说就是:可重入锁会多两个属性(1、获得该锁的线程;2、获得该锁的次数),根据第一个属性判断,如果是持有该锁的那个线程又来lock,不会被阻塞(wait),而是在上锁的次数加一(表示这个线程又锁了一次(重入)),只有该线程unlock的次数达到上锁的次数(即第二个属性等于0),才会唤醒其他线程。

    线程池

    一个装满Thread的容器,可重复使用线程。避免了频繁的创建新线程

    ExecutorService es = Executors.newFixedThreadPool(10); //创建线程数为10的线程池

  • 相关阅读:
    NDK开发,如何配置 debug环境
    NDK 开发中,各种指令集的坑,arm64
    levmar ndk 编译
    kubernetes 存储
    kubernetes 存储
    Docker 仓库
    docker 容器
    查看系统日志
    linux 进程命令小结
    DaemonSet
  • 原文地址:https://www.cnblogs.com/ttaall/p/11962874.html
Copyright © 2020-2023  润新知