2022-8-4 第八组 曹雨

LockSuppport工具类:(线程阻塞的工具类)

所有的方法都是静态方法,可以让线程在任何位置阻塞之后也有唤醒的方法。

park与parking:

如果我们把Thread看成一辆车,park就是把车停下,unpark就是让车开走。

 public static void main(String[] args) throws InterruptedException {
    Runnable runnable = () ->{
      synchronized (OBJ){
          System.out.println("线程"+Thread.currentThread().getName()+"正在执行");
          LockSupport.park("我被阻塞了");
          if (Thread.currentThread().isInterrupted()){
              System.out.println("被中断了");
          }
          System.out.println("继续执行");
      }
    };

1、park不需要获取某个锁
2、因为中断park,不会抛出异常,需要在park之后自行判断中断状态,然后再做额外的处理
3、类似于wait,和notify,不能与他们交叉使用
4、他们两个不会涉及死锁
5、block的作用是看到对象的信息

Lock锁:

 Lock lock = new Lock() {
    @Override
    public void lock() {
        try {
            //正常处理异常的解决方案
        }catch (Exception e){
            //出现异常的解决方案
        } finally {
          //手动释放锁
          lock.unlock();
        }
    }

sychronized和Lock的区别:
Lock以下功能是synchronized不具备的!
ReentrantReadwriteLock :
对于一个应用而言,一般情况下读操作远远多于写的操作,如果仅仅是读的操作没有写的操作,数据又是线程安全,读写锁给我们提供了一种锁,读的时候可以很多线程一起读,但是不能有线程写,写是独占的,当有线程在执行写的操作,其他线程既不能读,也不能写。

并发编程三大特性:

  • 原子性:原子操作可以是一个步骤,也可以是多个步骤,但是顺序不能乱也不可以被切割只执行其中的一部分,将整个操作视为一个整体。原子性不仅仅是多行代码,也可能是多条指令。
  • 可见性:
  • 有序性:
    synchronized lock:可以保证原子性,可见性,有序性。

线程池:

为什么要创建线程池?

  • 降低资源消耗
  • 提高响应速度,任务到达时,不需要创建线程就能运行
  • 提高线程的可管理性

JDk自带的四种线程池可通过Excutors提供的。

  • 1、newcachedThreadPool:创建一个可缓存线程池,如果线程池长度超过处理需要,可以灵活回收空闲线程;若无可回收,则新创建线程

  • 2、newFixedThreadPool:创建一个定长线程池,如果线程池的数量超过最大可并发数,则会在开始等待

  • 3、newScheduledThreadPooL:创建一个定长线程池,支持定时及周期性执行任务

  • 4、newsingleThreadExecutor:创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务都按照顺序执行。
    四种线程的初始化都调用了同一种构造器:

        ThreadPoolExecutor(int corePoolSize,
                           int maximumPoolSize,
                           long keepAliveTime,
                           TimeUnit unit,
                           BlockingQueue<Runnable> workQueue,
                           ThreadFactory threadFactory,
                           RejectedExecutionHandler handler)
    

参数的意义(重要):

  • corePoolSize:线程池里线程的数量,核心线程池大小
  • maximumPoolSize:指定了线程池里的最大线程数量
  • keepAliveTime:当线程池线程数量大于corePoolSize,多出来的空闲线程,多长时间被销毁
  • unit:时间单位
  • workQueue:任务队列,用于存放提交但是尚未被执行的任务
  • threadFactory:线程工厂,用来创建线程,线程工厂就是我们new线程的
  • handler:拒绝策略,是将任务添加到线程池中时,线程池拒绝该任务多采取的相应的措施。

常见的工作队列:

  • ArrayBlockingQueue:基于数组的有界阻塞队列。FIFO。
  • LinkedBlockingQueue:基于链表的有界阻塞队列。FIFO

线程池提供了四种拒绝策略:

  • AbortPolicy:直接抛出异常,默认的策略。
  • CallerRunPolicy:用调用者所在的线程来执行任务
  • DiscardOldestPolicy:丢弃阻塞队列中最靠前的任务,并执行当前任务
  • DiscardPolicy:直接丢弃任务

重点掌握:

  • 1.创建线程的4种方式*****
  • 2.线程同步(synchronized,ReentrantLock,ReentrantReadWriteLock)*****
  • 3.线程之间的通信(wait,notify,notifyAll)*****
  • 4.线程类的常用方法***
    指令重排,线程争抢,可见性,原子性,volatile关键字

总结:

多线程的学习,在今天结束了。感觉知识点很多,很杂。有关于锁的部分,在老师这几天的演示中,我看到了好多种锁的方式,感觉有些搞不清楚。对锁的理解也不是特别的透彻,只知道锁是为了让一个线程工作时,另一个线程不工作。但是具体的多种用法,搞得不是很清楚。

posted on   figh466  阅读(34)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示