002--volatile 关键字-内存可见性

话题一:多线程的3种创建方式

Java使用Thread类代表线程,所有的线程对象都必须是Thread类或其子类的实例。Java可以用三种方式来创建线程,如下所示:
1)继承Thread类创建线程
2)实现Runnable接口创建线程
3)使用Callable和Future创建线程


话题二:wait和notify的理解与使用

  • 案例分析wait和notify

  • wait和notify知识补充:首先要理解notify()和wait(),因为这两个方法本来就不属于Thread类,而是属于最底层的object基础类的,也就是说不光是Thread,每个对象都有notify和wait的功能,为什么

因为他们是用来操纵锁的,而每个对象都有锁,锁是每个对象的基础,既然锁是基础的,那么操纵锁的方法当然也是最基础了.


话题三:同样是线程休眠:wait(),sleep(),suspend()有什么区别呢?

  • wait:让当前线程阻塞,同时又“积极”地等待条件发生改变,这一点很关键,sleep和suspend无法做到.
    1)因为我们有时候需要通过同步(synchronized)的帮助来防止线程之间的冲突,而一旦使用同步,就要锁定对象,也就是获取对象锁,其它要使用该对象锁的线程都只能排队等着,等到同步方法或者同步块里的程序全部运行完才有机会.在同步方法和同步块中,无论sleep()还是suspend()都不可能自己被调用的时候解除锁定,他们都霸占着正在使用的对象锁不放

    2) 而wait却可以,它可以让同步方法或者同步块暂时放弃对象锁,而将它暂时让给其它需要对象锁的人(这里应该是程序块,或线程)用,这意味着可在执行wait()期间调用线程对象中的其他同步方法!在其它情况下(sleep啊,suspend啊),这是不可能的.

    3) 但是注意我前面说的,只是暂时放弃对象锁,暂时给其它线程使用,我wait所在的线程还是要把这个对象锁收回来的!

  • sleep:

  • suspend:


话题四:wait()暂时放弃对象锁后,如何将对象锁收回来?

  • 第一种方法,限定借出去的时间.在wait()中设置参数,比如wait(1000),以毫秒为单位,就表明我只借出去1秒中,一秒钟之后,我自动收回:wait(long timeout);
  • 第二种方法,让借出去的人通知我,他用完了,要还给我了.这时,我马上就收回来:notify();
  • PS:.哎,假如我设了1小时之后收回,别人只用了半小时就完了,那怎么办呢?靠!当然用完了就收回了,还管我设的是多长时间啊!

话题五:线程的可用方法展示

  • notify():通知
  • wait():等待
  • run():执行
查看Thread线程的方法

话题六:synchronized和volatile?

1.volatile问题引出

// 老师演示的时候,有一个问题,虽然子线程falg=true,但是main线程打印依然是false!但是在我的JDK上没有重现这一个现象
public class TestVolatile {
    public static void main(String[] args) throws Exception {
        // 1.创建一个线程
        MyThreadA myThreadA = new MyThreadA();
        new Thread(myThreadA).start();
        new Thread(myThreadA).start();
        
        // 2.mian主线程
        while(true){
            if (myThreadA.flag) {
                System.out.println("-------------主线程flag:"+myThreadA.flag);
                Thread.sleep(1000);
            }else{
                System.out.println("*************主线程flag:"+myThreadA.flag);
                Thread.sleep(1000);
            }
        }
    }
}
class MyThreadA implements Runnable{
    public boolean flag = Boolean.FALSE;
    
    @Override
    public void run() {
        try {
            System.out.println("-----------自定义线程执行休眠1s");
            Thread.sleep(200);
            flag = Boolean.TRUE;
            System.out.println("-----------休眠结束flag:"+flag);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

2.synchronized(object){}代表什么含义?
- 只能由一个线程同时使用object
- 多线程时,先判断锁,有锁就要将后续线程阻塞挂起,直到下一次CPU重新给他进行任务分配
- 加锁的这种效率是最低的!但是又需要刷新数据(内存可见性的问题),怎么办?--volatile
- volatile可以保证多个线程在访问相同数据时候,数据是实时可见的(实时将缓存数据刷新到主存中)!


3.synchronized和volatile比较
- volatile对比于synchronized,是一种轻量级的同步策略!
- volatile不具备"互斥性",不能保证只有一个线程使用共享数据
- volatile不能保证变量的原子性


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

推荐阅读更多精彩内容

  • 本文出自 Eddy Wiki ,转载请注明出处:http://eddy.wiki/interview-java.h...
    eddy_wiki阅读 2,052评论 0 14
  • Java多线程学习 [-] 一扩展javalangThread类 二实现javalangRunnable接口 三T...
    影驰阅读 2,949评论 1 18
  • 本文主要讲了java中多线程的使用方法、线程同步、线程数据传递、线程状态及相应的一些线程函数用法、概述等。 首先讲...
    李欣阳阅读 2,438评论 1 15
  • 结局或开始——献给遇罗克作者:北岛 我,站在这里代替另一个被杀害的人为了每当太阳升起让沉重的影子象道路穿过整个国土...
    a9427bd9da65阅读 1,759评论 2 4
  • 《太阳的后裔》里,收到柳大尉的遗书,姜暮烟哭红了眼;而尹明珠一直带在身边,却没有打开过。一瞬间,脑子里有一个想法,...
    甪玺阅读 2,139评论 0 2