• 多线程-面试


    多线程:

     

    多线程的概念:

    进程:电脑中时不时的会有很多单独的运行的程序,每个程序都有一个独立的进程,而进程之间是相互独立存在的

    线程:进程想要执行任务就需要依赖线程。换句话说,就是进程中的最小执行单位就是线程,并且一个进程至少有一个线程

    线程里面两个很重要的概念:

    串行:单条线程来执行多个任务,按照一定的顺序一个个执行

    并行:多条线程同时执行某一个任务,在时间上是重叠的 eg:单刷boss和组队刷boss

    线程安全 当多个线程访问某个方法的时候,不管你通过怎样的调用方式、或者说这些线程如何交替的执行,我们在主程序中不需要去做任何的同步,这个类的结果行为都是我们设想的正确行为,那么我们就可以说这个类是线程安全的。

     

    eg:boss掉落了一件装备,大家同时去拾取,只能有一个人先抢到。

    如何保证线程安全

    1.synchronized:synchronized关键字,就是用来控制线程同步的,保证我们的线程在多线程环境下,不被多个线程同时执行,确保我们数据的完整性,可以将这个关键字加载方法上面,也可以加载代码块上面。

    2.ReentrantLock:ReentrantLock是咋java1.6的时候被引入进来的,使用它需要我们手动获取锁和释放锁,他提供终端获取以及超市获取的同步特性

    3.Redis锁:结合setnx命令实现,指定的key不存在时,为key设置指定的值,设置成功返回1,设置失败返回0.

    4.Redission:封装了redis很懂原生方法,并提供分布式环境的各种实现,RLock就是一个锁实现。

    5.原子类:java.util,concurrent.atomic包下有很多封装好的原子类。

    多线程的应用场景

    1.map-reduce任务:多个线程运行map任务,可以是清晰数据、聚合数据等,在将处理后的数据reduce在一起。

    2.群发短信、push、消息:平时的推广、活动通知之类的业务

    3.下载、内容抓取:内容下载和一些信息内容抓取等业务

    4.生产者消费者模式:应用内实现此模式就需要用到多线程,多个生产者和消费者。

    多线程的实现方式

    1.实现Runnable接口

    2.继承Thread类

    3.实现Callable接口

    4.使用JDK自带Executor框架,不够灵活,有局限性

    5.自定义配置ThreadPoolExector线程池,推荐

  • 相关阅读:
    POJ 3667 & HDU 3308 & HDU 3397 线段树的区间合并
    HDU 5992 kd-tree
    BZOJ 4154 kd-tree dfs序 + 二维空间的区间(矩阵)更新单点查找
    BZOJ 4066 kd-tree 矩形询问求和
    BZOJ 1941 kd-tree
    BZOJ 2648 kd-tree模板
    HDU 5925 离散化
    php trait
    php命名空间
    js
  • 原文地址:https://www.cnblogs.com/dongyaotou/p/14585743.html
Copyright © 2020-2023  润新知