线程二

Java中的锁

Thread API

Java不推荐直接停止一个线程,推荐让线程代码执行完以后优雅的停止,如果直接暴力停止一个线程,可能会导致一些资源无法被释放或一些标记状态无法

被改变/还原.而如果一定要让线程执行完,代码存在BUG或着运行异常时可能会导致两个问题的出现

1.线程阻塞 2.线程中有while()条件判断且一直为true

JVM推荐解决以上两个问题的思想是:

遇到阻塞就去解阻塞,解阻塞以后继续执行代码,最后停止线程。

如果遇到使用线程之外的Boolean类型标记变量做while()循环的判断条件,尝试将boolean值改为fasle解除死循环后继续执行代码。最后停止线程。

JVM如何实现以上的两个问题的解决思想?

参考Thread类中的API interrput(),isInterrputed();

如果线程阻塞了,调用interrput()方法,会抛出一个InterrputedException从而进入到catch代码块中,catch代码块中补充异常处理逻辑,

异常处理完后代码会继续向下执行,最后解除阻塞。

如果是遇到while()循环,判断一个线程之外的Boolean标记,JVM推荐使用thread.isInterrputed()方法代替Boolean标记去做判断,代码运行时

出现BUG导致死循环后,调用interrput()方法,这个方法会改变isInterrputed()的返回值,从而跳出死循环,代码继续向下执行,直到线程结束。

为什么要用isInterrputed()方法替代Boolean标记?

1.如果使用线程之外的Boolean标记变量会有不可见问题

2.JVM优化导致指令重排的问题

什么是指令重排,Java为什么要使用指令重排进行优化?

最终的代码会被翻译成为CPU指令,例如 int i= 1;int k = 0; i++,CPU寄存器中永远只有一个变量,如果不重排,先要在内存中找变量i地址,再找k,

然后再i++,这样麻烦且效率低,Java内存模型,成员变量在堆中,寻找堆中变量的地址是十分的麻烦的,直接在方法栈中定义临时变量,使用指令重排

的时候,会先执行int i = 1;然后执行i++,最后执行k = 0;这样可以提高效率,指令重排有很多中模式。

指令重排发生在编译阶段还是执行阶段?

都有

什么时候会发生指令重排?

例如当一个线程执行的时候,其中有一个while(flag)判断,同时flag为线程之外的变量。while(flag){}中没有代码(i++也可以),JVM会进行激进的

优化方式指令重排,会在线程中定义一个临时变量,将线程之外的Boolean flag赋值给临时变量。这时线程就不会停止,while(){}代码将一直执行,

如果while(){}方法体中有其他的方法调用,JVM会认为他可能存在方法溢出,就不会发生指令重排

如何理解java的interrupt()方法

此方法是让程序员去优雅的停止一个线程的函数,JVM不推荐开发人员直接停止一个线程, 直接停止一个线程会导致资源无法及时释放,

所以JVM推荐让线程执行完后优雅的停止,interrupt()方法可以解阻塞,让线程继续向下执行,或者可以让while(true)这种BUG代码条件

标识被改变,从而继续执行下去

synchronized关键字 //https://www.cnblogs.com/jyroy/p/11365935.html

synchronized是操作系统锁的原理,创建pthread_mutex_t mt 变量,可以将mt变量理解为一个整形,声明时为0,初始化调用pthread_mutex_init(mt)函数

传入mt变量,通过pthread_mutex_lock(mt)函数加锁,mt变量改为1,当代码块中的代码执行完毕后,通过pthread_mutex_unlock(mt)函数解锁,mt变为0

其他线程进来的时候,如果mt为0其他线程可以获得锁,如果为1则无法获取锁。

synchroized实现一把锁分三种

偏向锁 我们的方法一定要保证线程安全,但在实际情况下不一定有互斥(只有一个线程访问,那么该线程会自动获取锁,降低获取锁的代价),偏向锁是

在synchronized锁的对象没有资源竞争下存在的,偏向锁只会调用一次系统函数获取一次锁,之后将一直持有锁。只能有一个线程访问。

轻量级锁  当一个偏向锁被其他线程访问的时候,偏向锁升级为轻量级锁,其他线程尝试通过自旋的形式获取锁,不会阻塞,从而提升性能,

  轻量级锁一般发生在多个线程交替执行,没有竞争的情况下。

重量级锁  通过操作系统函数实现的锁都是重量级锁,每次访问代码块的时候都会调用OS函数,JDK1.5之前synchroized实现的锁都是重量级锁。

1.6以后做了优化,偏向锁就是优化的一个结果。

为什么要优化synchronized关键字?

因为是重量级锁,重量级锁是存在在互斥场景当中的,当前方法只有一个单线程去访问,就不存在线程之间资源竞争(互斥)的问题。

这时重量级锁就显得很笨重,消耗资源,耗费时间,然后如果不存在互斥的场景为什么还要使用锁?原因是,当前情况可能是只有一个线程

去执行,但并不能确定以后也只会有一个线程去访问,可能会变为有多个线程去访问,这时候就会产生线程竞争的问题,所以优化是考虑了

线程安全的问题,防止改方法在以后的场景调用下出现并发问题,这样我们可以说这个方法是一个线程安全的方法。这被称为偏向锁

如何证明偏向锁存在?

修改Linux源码,Java代码调用操作系统加锁操作时,Linux控制台都会打印一遍线程ID,synchronized关键字修饰的方法,在执行时,会调用操作系统的

加锁函数,这时将会打印出线程ID。如果是偏向锁,只会调用一次系统函数加锁,控制台只会打印一次线程ID,但是JVM本身在运行时会很多的锁操作

如何区分打印出来的线程ID是我们启动的线程ID?我们可以在Java代码中调用一个本地方法,该方法返回本线程的ID,再输出,输出时可以加上一些

标识,比如使用"java thread print:" + thread id,Linux控制台上一定会打印synchronized代码块被执行的时候的thread id,还有Java代码调用本地

方法输出的线程"java thread print:" + thread id,如果是偏向锁,上述两条打印语句,第一句只会出现一次,第二句则会一直输出。重量级锁,会出现

上述两条语句在一起输出多次


-+

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

推荐阅读更多精彩内容