Java 线程 和 锁 基础知识

更多并发相关内容,查看==>Java 线程&并发学习目录

进程是资源分配的最小单元,线程是程序执行的最小单元,通常在一个进程中包含了多个线程。单个CPU在一个时刻只能把时间片分配给一个线程去执行。线程的整个生命周期包含了多个状态,未运行的初始状态,启动后未获取CPU时间片的待运行状态,任务执行完成后的消亡态,和线程紧密工作的锁又是如何控制线程的进入和退出的,接下来就学习和了解下Java的线程和锁的基本特点。

1、线程Thread 生命周期 & 基本使用

线程类中包含了多种状态,可通过getState方法获取到State枚举类信息

public enum State {
    NEW,   
    RUNNABLE,
    BLOCKED,  
    WAITING,  
    TIMED_WAITING,  
    TERMINATED;
}

NEW:线程还未开始的状态
RUNNABLE:在JVM中是运行的状态,但真正执行需要操作系统分配必须的资源才可运行
BLOCKED:等待Monitor Lock(监视器锁) 被阻塞导致,例如synchronized
WAITING:因为非时间因素导致线程等待的,例如Object.wait()、Thread.join()、LockSupport.park()等
TIMED_WAITING:因为时间因素导致线程等待的,例如Thread.sleep()、Object.wait(time)、Thread.join(time)等
TERMINATED:线程执行完成,消亡状态了

实际状态流转中每一种状态的变更都是有着其具体的原因,例如Object.wait()方法执行后,线程一方面会自行暂停,另一方面会进入到当前对象的一个等待集合中,等待超时、notify唤醒又或者中断引发的中断时间而离开等待集合,如下图可能可以更好的说明线程的流转关系。

image.png

具体方法以及相关关键字在后面再做介绍,先了解下线程如何使用的,线程的使用有两种方法,继承Thread 类实现Runnable 接口,都是重写run方法,Runnable更多的可以看做是一个Task任务,任务可以交由任何可执行的线程去执行,但是继承Thread的在一创建时就已经固定了,没有足够的灵活性,推荐使用Runnable

用java8最新的lambda表达式也可以很方便的写成Runnable runnable = () -> {/* run方法运行实体*/},然后直接交给Thread执行即可。

请勿直接调用线程的run方法,那样无法创建新线程执行。调用start方法会由native方法创建新线程然后调用run方法

2、锁

现实中我们也大量的应用到锁,为了防止家里的财产被盗,离开家门时会锁门,日常用的电脑为了确保资料安全也会给自己的账户设置个密码锁,不过这也意味着我们日常外出需要带着钥匙,记住密码,要不然会导致很多不必要的麻烦。和实际生活一样,Java中的锁也是为了保证数据(服务)安全,也会对服务的性能、吞吐量等造成影响。

那锁是什么呢?

  • Java中的一切都是对象,锁也不例外,这个被锁的对象只能由锁保护资源所在的线程去访问
  • 锁可以控制对数据访问的先后顺序(强行串行化)
  • 锁可以控制对数据是否拥有访问权
  • 锁可以控制服务的活跃性问题
  • 锁也可以抑制指令重排(降低效率)

常见的锁种类

  • synchronized:Java原生语义支持的,内置锁,可重入,悲观的,在JDK1.5以后synchronized在不同情况下从 无锁->偏向锁->轻量级所->重量级锁的转变。
  • ReentrantLock:基于AQS开发的可重入锁,有公平和非公平之分,也可以感知到中断
  • CountDownLatch:基于AQS开发的锁,也叫计时器锁,当计数器减为0后,就可以执行其他任务了,不可重置
  • CyclicBarrier:同样是基于AQS开发的锁,也叫栅栏锁,有换代的操作,可重置(想象成多个栅栏一般)
  • Condition:条件锁,用在阻塞队列中,可控制消费者和生产者的读取进度
  • ReentrantReadWriteLock:读写锁,读和写拆开,可以极大的提高读多写少的场景下的性能

对象锁对应的监视器锁结构如下图所示

image.png

本图来自:https://www.programcreek.com/2011/12/monitors-java-synchronization-mechanism/

  • Special Room:当前运行的线程所存储的地方
  • Entry Set: 所有需要获取当前锁的线程存储的地方
  • Wait Set:所有被调用wait方法的线程存储的地方

3、Object 的wait 和 notify 方法

wait、notify方法是Object类的final native方法,不能被重写,而且必须有同步器synchronize的辅助才可以使用(这个是JVM规定的)

    synchronized (OBJ) {
        try {
            while (count <=0) {
                 // 当前线程暂停执行
                OBJ.wait();
            }
            ......
            // 具体的任务
            OBJ.notify();
            // 唤醒其他线程工作
        } catch (InterruptedException e1) {
            e1.printStackTrace();
            // 由wait方法触发的中断
        }
    }

wait方法是用来释放锁并且暂停服务的,从上面的线程流转图也可以看出来,对象调用wait()方法后,当前执行的线程会进入到当前对象的监视器对象的Wait Set区域内,执行notify方法,会从Wait Set集合中随便挑选一个然后唤醒操作进入到Entry Set集合中,后续的具体执行还得看具体的资源分配等情况,notifyAll方法可以唤醒所有等待的线程,至于那一个现在真正的执行同样也是无法感知的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,001评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,210评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,874评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,001评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,022评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,005评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,929评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,742评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,193评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,427评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,583评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,305评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,911评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,564评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,731评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,581评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,478评论 2 352

推荐阅读更多精彩内容