首页 > 编程语言 > 详细

多线程

时间:2021-08-30 06:18:45      阅读:7      评论:0      收藏:0      [点我收藏+]

一.程序,进程,线程的区别是什么?

程序是一个指令的集合,程序不能独自执行,只有被加载到内存中,系统为它分配资源才能执行。
进程,一个执行中的程序叫做进程。进程是系统分配资源的独立单位,每个进程占有特定的地址空间。
线程,是进程的“单一的连续控制流程”。是CPU调度和分配的基本单位,比进程更小能独立运行的基本单位。也被称为轻量级的进程。
线程不能独立存在,必须依附于某个进程。一个进程可以包括多个并行的线程,一个线程肯定属于一个进程。
进程:是分配资源基本单位
线程:是执行调度的基本单位

二.创建多线程的方法?

继承Thread类创建线程。
实现runnable接口。
实现callable接口通过futureTask包装器来创建Thread线程。
使用ExcutorService,Callable,Future实现有返回的线程。

三.当调用一个线程对象的start方法后,线程马上进入运行状态吗?

不是,只是进入就绪(可运行)状态,等待分配CPU时间片,一旦得到CPU时间片,进入运行状态。

四.线程的几种状态

1.线程通常有五种状态,创建,就绪,运行,阻塞和死亡状态。
2.阻塞状态分为3种:
    等待阻塞:运行的线程执行wait()方法,该线程会释放所有资源,JVM会把线程放入等待池中。进入后不能自动唤醒,需要要其他线程notify()或notifyAll()唤醒。wait()是object类方法。
    同步阻塞:运行的线程在获取对象的同步锁时,若锁被其他线程占用,则JVM会把线程放入锁池中。
    其他阻塞: 运行的线程执行Sleep()或者join(),或者发出了I/O请求,JVM会把线程置为阻塞状态。当sleep(),join()等待线程终止或超时,I/O处理完,线程重新转入就绪状态,sleep是Thread类的方法。

五.Synchronized和Lock区别

    Synchronized是关键字,基于JVM层面。Lock是java.util.concurrent.Locks.lock具体类。
    Synchronized不需要用户手动取释放锁,执行完系统会自动让线程释放锁的占用。ReentrantLock需要用户去手动释放锁。若没有释放,可能会出现死锁。
    Synchronized不可中断,除非跑出异常或者正常执行完成。ReentrantLock可中断:
            1.设置超时方法tryLock(long timeout,TimeUnit unit)
            2.lockInterruptibly()放代码块中;调用interrupt()方法可中断
    Synchronized是非公平锁,reentrantlock可设置是否公平,构造方法传入boolean值,true为公平。
    reentrantlock可绑定多条件Condition,实现分组唤醒相应唤醒的线程,精确唤醒线程。synchronized要么唤醒一个线程,要么全部唤醒。
 
Synchronized Lock CAS
 
悲观:所谓给对象加锁原理 就是给对象的对象头部做个标记
乐观:不上锁也可以保证原子性。CAS :如果没被打断,就操作。反之,就重试。
        1.ABA问题:加版本号  (1.自增,2.boolean)
        2.保障操作原子性?AtomicInteger
            底层cas如何保持原子性,;lockandexcahnge
多核儿就是系统同时可以运行多个线程,比如双核可以同时执行两个线程。单核儿只能一次执行一个线程。
 
多线程要在多核上才能真正有优势。
 
semaphore,countdownlatch,CyclicBarrier

多线程

原文:https://www.cnblogs.com/yujiantong/p/15200822.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!