梳理笔记

java中进程和线程实现的方式

进程的三个特点:独立性 动态性 并发性
线程特点:

  1. 线程可以完成一定任务,可以和其它线程共享父进程的共享变量和部分环境,相互协作来完成任务。
  2. 线程是独立运行的
  3. 线程的执行是抢占式的
线程实现方式
  1. 继承Thread类创建线程类
  2. 实现Runnable接口
  3. 使用callable和future创建线程

thread类中有几个重要的方法?各个常用方法的作用

  • yield()方法的作用是放弃当前的CPU资源,将它让给其他任务去占用CPU执行时间 getId() - - =
  • sleep()的作用是在指定毫秒时间内,让当前正在执行的线程休眠(暂停执行)。这个正在执行的线程是指this.currentThread()返回的线程 -
  • currentThread()currentThread()方法可以返回代码段正在被哪个线程调用的信息。 isAlive()

wait和sleep区别?wait,notify是不是线程的方法

  • Java程序中wait 和 sleep都会造成某种形式的暂停,它们可以满足不同的需要。wait()方法用于线程间通信,如果等待条件为真且其它线程被唤醒时它会释放锁,
  • 而sleep()方法仅仅释放CPU资源或者让当前线程停止执行一段时间,但不会释放锁。

Java线程yield与join方法的区别

  • sleep()方法暂停当前线程后,会给其他线程执行机会,线程优先级对此没有影响。yield()方法会给优先级相同或更高的线程更高的执行机会。
  • sleep()方法会将线程转入阻塞状态,直到阻塞时间结束,才会转入就绪状态。
    yield()方法会将当前线程直接转入就绪状态。
  • sleep()方法声明抛出了InterruptedException异常,所以调用sleep()方法时要么捕捉该异常,要么显示声明抛出该异常。yield()方法则没有声明抛出任何异常。
  • sleep()方法比yield()方法有更好的移植性,通常不建议使用yield()方法来控制并发线程的执行.

线程方法:join,yield,sleep,interrupt

  • Object类的实例方法,释放CPU执行权,进入等待状态,直到 被中断、被拥有该对象锁的线程唤醒(notify或notifyAll)、会释放所持有的对象锁
  • sleep:Thread类的静态方法,释放CPU执行权,等待指定时间后自己醒来。不会释放所持有对象的锁
  • interrupt:1、打断处于等待状态的线程

object方法wait,notify,notifyall

  • wait()、notify/notifyAll() 方法是Object的本地final方法,无法被重写。
  • wait()执行后拥有当前锁的线程会释放该线程锁,并处于等待状态(等待重新获取锁)
  • otify/notifyAll() 执行后会唤醒处于等待状态线程获取线程锁、只是notify()只会随机唤醒其中之一获取线程锁,notifyAll() 会唤醒所有处于等待状态的线程抢夺线程锁。

sychronized同步锁,锁的是什么?

  • 在修饰方法的时候,默认是当前对象作为锁的对象
  • 在修饰类时,默认是当前类的Class对象作为所的对象
  • 故存在着方法锁、对象锁、类锁 这样的概念

synchronized可以锁当前对象,也可以锁类

静态方法和非静态方法,锁的区别

  • static方法调用方式是通过class.fun,而非static方法调用是先new出这个对象,再调用
  • static synchronized是类锁,synchronized是对象锁。

java并发,并行的区别

并行:是两个任务同时运行,就是甲任务进行的同时,乙任务也在进行。(需要多核CPU)
并发:指两个任务都请求运行,而处理器只能按受一个任务,就把这两个任务安排轮流进行,由于时间间隔较短,使人感觉两个任务都在运行。(表面看是CPU在同时执行多个任务,其实实际上是因为CPU瞬间切换到其他任务的速度特别快,在不同的任务之间一直在不停的切换,给不同的任务分配了不同的时间。)

多线程安全问题

  • 线程安全出现的根本原因:

    1.存在两个或者两个以上的线程对象共享同一个资源;

    2.多线程操作共享资源代码有多个语句。
    方式一:同步代码块

    格式:synchronize(锁对象){

                    需要被同步的代码
    
             }
    

同步函数(同步函数就是使用synchronized修饰一个函数)
推荐使用:同步代码块

原因:

    1.同步代码块的锁对象可以由我们自由指定,方便控制;

    2.同步代码块可以方便的控制需要被同步代码的范围,同步函数必须同步函数的所有代码。

死锁现象,4个必要条件和解决方案

概念:多个并发进程因争夺系统资源而产生相互等待的现象。
原理:当一组进程中的每个进程都在等待某个事件发生,而只有这组进程中的其他进程才能触发该事件,这就称这组进程发生了死锁。
本质原因:

  1. 系统资源有限。
  2. 进程推进顺序不合理。
  3. 互斥:某种资源一次只允许一个进程访问,即该资源一旦分配给某个进程,其他进程就不能再访问,直到该进程访问结束。
  4. 占有且等待:一个进程本身占有资源(一种或多种),同时还有资源未得到满足,正在等待其他进程释放该资源。
  5. 不可抢占:别人已经占有了某项资源,你不能因为自己也需要该资源,就去把别人的资源抢过来。
  6. 循环等待:存在一个进程链,使得每个进程都占有下一个进程所需的至少一种资源。
    当以上四个条件均满足,必然会造成死锁,发生死锁的进程无法进行下去,它们所持有的资源也无法释放。这样会导致CPU的吞吐量下降。所以死锁情况是会浪费系统资源和影响计算机的使用性能的。那么,解决死锁问题就是相当有必要的了。

解决方案参考

多线程同步

  1. 同步方法:即有synchronized关键字修饰的方法。 由于java的每个对象都有一个内置锁,当用此关键字修饰方法时, 内置锁会保护整个方法。在调用该方法前,需要获得内置锁,否则就处于阻塞状态
  2. 同步代码块:即有synchronized关键字修饰的语句块。 被该关键字修饰的语句块会自动被加上内置锁,从而实现同步
  3. wait与notify:
  • wait():使一个线程处于等待状态,并且释放所持有的对象的lock。

  • sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。

  • notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。

  • Allnotity():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。

  1. 使用特殊域变量(volatile)实现线程同步
  • volatile关键字为域变量的访问提供了一种免锁机制
  • 使用volatile修饰域相当于告诉虚拟机该域可能会被其他线程更新
  • 因此每次使用该域就要重新计算,而不是使用寄存器中的值
  • volatile不会提供任何原子操作,它也不能用来修饰final类型的变量
  1. 使用重入锁实现线程同步
    在JavaSE5.0中新增了一个java.util.concurrent包来支持同步。
    ReentrantLock类是可重入、互斥、实现了Lock接口的锁,它与使用synchronized方法和快具有相同的基本行为和语义,并且扩展了其能力。
    注:关于Lock对象和synchronized关键字的选择:
  • 最好两个都不用,使用一种java.util.concurrent包提供的机制,能够帮助用户处理所有与锁相关的代码。
  • 如果synchronized关键字能满足用户的需求,就用synchronized,因为它能简化代码
  • 如果需要更高级的功能,就用ReentrantLock类,此时要注意及时释放锁,否则会出现死锁,通常在finally代码释放锁
  1. 使用局部变量实现线程同步
    如果使用ThreadLocal管理变量,则每一个使用该变量的线程都获得该变量的副本,副本之间相互独立,这样每一个线程都可以随意修改自己的变量副本,而不会对其他线程产生影响。
    ThreadLocal 类的常用方法:
  • ThreadLocal() : 创建一个线程本地变量
  • get() : 返回此线程局部变量的当前线程副本中的值
  • initialValue() : 返回此线程局部变量的当前线程的"初始值"
  • set(T value) : 将此线程局部变量的当前线程副本中的值设置为value
    注:ThreadLocal与同步机制
  1. ThreadLocal与同步机制都是为了解决多线程中相同变量的访问冲突问题。
  2. 前者采用以"空间换时间"的方法,后者采用以"时间换空间"的方式
  3. 使用阻塞队列实现线程同步
    详细内容参考

java并发的三个特性,原子性,可见行,有序性

  1. 原子性是指一个操作是不可中断的。即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其它线程干扰。
    Java中的原子操作包括:
  • 除long和double之外的基本类型的赋值操作
  • 所有引用reference的赋值操作
  • java.concurrent.Atomic.* 包中所有类的一切操作。
  1. 有序性
    有序性即程序执行的顺序按照代码的先后顺序执行。

在Java内存模型中,允许编译器和处理器对指令进行重排序,但是重排序过程不会影响到单线程程序的执行,却会影响到多线程并发执行的正确性。(例如:重排的时候某些赋值会被提前)
在Java里面,可以通过volatile关键字来保证一定的“有序性”(具体原理在下一节讲述)。另外可以通过synchronized和Lock来保证有序性,很显然,synchronized和Lock保证每个时刻是有一个线程执行同步代码,相当于是让线程顺序执行同步代码,自然就保证了有序性

  1. 可见性
    可见性是指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。

可见性,Java提供了volatile关键字来保证可见性。
当一个共享变量被volatile修饰时,它会保证修改的值会立即被更新到主存,当有其他线程需要读取时,它会去内存中读取新值。
而普通的共享变量不能保证可见性,因为普通共享变量被修改之后,什么时候被写入主存是不确定的,当其他线程去读取时,此时内存中可能还是原来的旧值,因此无法保证可见性。
另外,通过synchronized和Lock也能够保证可见性,synchronized和Lock能保证同一时刻只有一个线程获取锁然后执行同步代码,并且在释放锁之前会将对变量的修改刷新到主存当中。因此可以保证可见性。

详文参考

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

推荐阅读更多精彩内容