User Tools

Site Tools


java-concurrent:start

Java并发

如何实现多线程

三种实现方式:实现Runnable接口,实现Callable接口,或者继承Thread类(其实Thread类也是实现的Runnable接口)

Callable和Runnable的区别: Callable还允许线程带有返回值返回,而Runnable没有

不过真正大家写代码的时候,都是用Executor线程池的方式。

线程状态及相互通信

ThreadA a = new ThreadA();    //此时是New状态

a.start();         //此时是Runnable状态(可能正在执行,也可能正在等待CPU的时间片)

//当使用同一个对象的synchronized线程中,有一个线程获得锁,执行synchronized的方法体,那么其他线程就Blocked的状态

//当线程执行方法体内调用 wait()时,那么就会释放锁,然后进入Waiting 无限期等待 状态

//当线程执行方法体内调用notify(), notifyAll() 就能将wait的线程恢复为Runnable.

Thread.sleep(3000)    //此时本线程进入 Timing Waiting有限时间等待的状态,但不会释放锁。

另外:
任何异常会导致线程 释放锁,线程终止,所以必须catch异常。

await, signal,signalAll 相当于是jdk版本的实现。 wait(), notify(), notifyAll() 是jvm版实现

类似ReentrantLock是同步锁的jdk版本实现,synchronized关键字是同步锁的jvm版本实现

并发工具类

并发工具类:CountDownLatch, CyclicBarrier, Semaphore的使用, 参考 并发工具类

关于线程池

请参考:线程池

关于Java内存模型

java线程之间的通信由java内存模型(JMM)控制,JMM决定一个线程对共享变量的写入何时对另一个线程可见。
从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系:线程之间 的共享变量存储在主内存中,
每个线程都有一个私有的本地内存,本地内存存储了该线程以读/写共享 变量的副本。

重排序(编译器和处理器为了优化性能而做的指令重排序)
JMM限制重排序 为程序员提供内存可见性保证
happens-before 八大原则

volatile & sychronized

volatile大致的原理: 写入到工作内存的时候,立刻刷新到主内存。

读工作内存的时候,置失效,直接去主内存读。

sychronized: 可重入 http://www.morganliao.com/wiki/doku.php?id=java-concurrent:sychronized

ReentrantLock 相当于 synchronized的jdk版实现。但是比后者更强大,更灵活。同时支持公平锁。 可重入

并发集合

java-concurrent/start.txt · Last modified: 2019/09/12 09:24 by 127.0.0.1

Except where otherwise noted, content on this wiki is licensed under the following license: 沪ICP备12046235号-2
Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki