zoukankan      html  css  js  c++  java
  • 【JAVA SE基础篇】61.多线程相关1

    1.任务定时调度

    通过Timer和Timetask,我们可以实现定时启动某个线程。

    java.util.Timer:类似闹钟的功能,本身实现的就是一个线程

    java.util.TImerTask:一个抽象类,该类实现了Runnable接口,所以该类具备了多线程的能力

    2.QUARTZ

    任务调度框架:

    Scheduler:调度器,控制所有的调度

    Trigger:触发条件

    JobDetail:需要处理JOB

    Job:执行逻辑

    3.指令重排(HappenBefore)

    执行代码的顺序可能与编写代码不一致,即虚拟机优化代码顺序,则为指令重排

    数据依赖:如果两个操作访问同一个变量,且这两个操作中有一个为写操作,此时这两个操作之间就存在数据依赖。

    存在数据依赖的两个操作重排,则会影响执行结果。所以编译器和处理器在重排时,会遵守数据依赖性,

    编译器和处理器不会改变存在数据依赖关系的两个操作的执行顺序

    4.volatile

    volatile保证线程间变量的可见性,简单地说就是当线程A对变量X进行了修改之后,在线程A后面执行的其他线程能看到变量X的变动,更详细地说时要符合以下两个规则:

    线程对变量进行修改后,要立刻回写到主内存

    线程对变量读取的时候,要从主内存中读,而不是缓存

    注:各线程的工作内存间彼此独立,互不可见,在线程启动的时候,虚拟机为每个内存分配一块工作内存,不仅包含了线程内部定义的局部变量

    也包含了线程所需要使用的共享变量(非线程内构造的对象)的副本,即为了提高执行效率

    volatile是不错的机制,但是volatile不保证原子性。

    5.单例模式

    DCL单例模式:在多线程环境下对外存在一个对象

    1.构造器私有化,避免外部new构造器

    2.提供私有的静态属性,存储对象的地址

    3.提供公共的静态方法,获取属性

  • 相关阅读:
    3.2 直线与方程
    3.1.2 两条直线平等与垂直的判定
    GNU Make
    linux 启动后台进程
    go 占位符
    raft 协议
    restTemplate 接收list数据
    JAVA通过实体类生成数据库查询语句(驼峰命名规则)
    flink使用命令开始、停止任务
    SPringBoot 配置类继承WebMvcConfigurationSupport和实现WebMvcConfigurer的使用
  • 原文地址:https://www.cnblogs.com/chengkuan/p/13384839.html
Copyright © 2011-2022 走看看