• 【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.提供公共的静态方法,获取属性

  • 相关阅读:
    多线程学习笔记第一篇
    当Visual Studio中win32控制台应用程序的注释也会生产代码时……
    博客行文及排版技法
    Debian Linux下的Python学习——安装python,vim
    onhashchange事件
    MyEclipse9 Maven开发Web工程 详细配置
    Java面向对象(上)
    lucene 的分析器(analyzer)与分词器(tokenizer)和过滤器(tokenfilter)
    java编程陷阱
    solr中文分词(mmseg4j)
  • 原文地址:https://www.cnblogs.com/chengkuan/p/13384839.html
Copyright © 2020-2023  润新知