Java多线程总结

Java 提供了三种创建线程的方法:

通过实现 Runnable 接口;
通过继承 Thread 类本身;
通过 Callable 和 Future 创建线程。

ThreadPoolExecutor extends ExecutorService extends Executor
ThreadPoolExecutor:线程池的具体实现类
newCachedThreadPoolExecutor:都是非核心线程,可以有无限数量的线程。60s回收空闲线程。
newFixedThreadPoolExecutor:固定线程数,都是核心线程,不回收空闲线程(核心线程)。
newScheduleThreadPoolExecutor:核心线程固定,非核心线程数无限。非核心线程空闲立即回收。
newSingleThreadExecutor

同步:Java中的同步指的是通过人为的控制和调度,保证共享资源的多线程访问成为线程安全,来保证结果的准确。

Thread.yield():会让运行中的线程切换到就绪状态(Runnable),重新争抢cpu的时间片,争抢时是否获取到时间片看cpu的分配。
yield:屈服;放弃

线程阻塞(Blocked)
线程的阻塞可以分为好多种,从操作系统层面和java层面阻塞的定义可能不同,
但是广义上使得线程阻塞的方式有下面几种

1、BIO阻塞,即使用了阻塞式的io流
2、Thread.sleep(long time):让线程休眠进入阻塞状态,该方法会抛出InterruptedException异常,即休眠过程中可被中断,被中断后抛出异常
3、mThread.join() 调用该方法的线程进入阻塞,等待mThread线程执行完恢复运行。
4、sychronized或ReentrantLock 造成线程未获得锁进入阻塞状态 (同步锁章节细说)
5、获得锁之后调用wait()方法 也会让线程进入阻塞状态 (同步锁章节细说)
6、LockSupport.park() 让线程进入阻塞状态 (同步锁章节细说)

Synchronized关键字:
1.对于静态方法,由于此时对象还未生成,所以只能采用类锁;Synchronized(XXX.class)
2.同一个类的不同对象的对象锁互不干扰。Synchronized(a)和Synchronized(b)互不干扰,并发运行临界区。
3.对象锁和类锁是独立的,互不干扰。

Synchronized:加锁
wait():释放锁,当前线程置入休眠状态,进入waitSet,可传入时间,如果指定时间内未被唤醒,则自动唤醒。wait()等同于wait(0),不会自动唤醒。
notify():不释放锁,随机唤醒一个waitSet里的线程.
notifyAll():不释放锁,唤醒waitSet中所有的线程.
重要:

  1. public static synchronized void method()和synchronized (A.class)锁住的都是类。
  2. public synchronized void method()和synchronized (this)锁住的都是对象。
  3. 同一个类锁/对象锁的多个方法,会被同一个线程锁住,其他线程无法访问这多个方法,但是可以访问未加锁的方法(没synchronized关键字的普通方法)。
  4. wait和notify使用场景是必须要有同步,synchronized,wait,notify,notifyAll必须使用同一个锁对象(this/XXX.class/某个对象的实例)。

wait 和 sleep的区别

  1. wait是Object的方法,sleep是Thread的方法
  2. wait()是用于线程间通信的,而sleep()是用于短时间暂停当前线程。
  3. wait后线程的状态是Watting,sleep后线程的状态为Time_Waiting
  4. Java中的wait方法应在同步代码块中调用,sleep则没要求。
  5. 进入wait状态的线程能够被notify和notifyAll线程唤醒,并且会释放实例对象所持有的锁。sleep不会被唤醒,也不会释放锁。

原子性:即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。
可见性:指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。
有序性:即程序执行的顺序按照代码的先后顺序执行。
要想并发程序正确地执行,必须要保证原子性、可见性以及有序性。只要有一个没有被保证,就有可能会导致程序运行不正确。

volatile
多线程的内存模型:main memory(主存)、working memory(线程栈),
在处理数据时,线程会把值从主存load到本地栈,完成操作后再save回去。
(volatile关键词的作用:每次针对该变量的操作都激发一次load and save)。
volatile一定程度上保证有序性(禁止指令重排序),不保证原子性。
volatile保证了可见性和有序性,volatile通过内存屏障来实现的。

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

推荐阅读更多精彩内容