进程
就绪状态、运行状态、阻塞状态、新建状态、终止状态。
线程
就绪状态、运行状态、阻塞状态、新建状态、终止状态。
- 就绪状态:线程被构建,但未调用start()方法。
- 运行状态:调用start()方法后。
- 终止状态:线程运行结束。
阻塞状态分为三种:
- 等待阻塞:运行的线程执行wait()方法,该线程会释放占用的所有资源,JVM会把该线程放入“等待池”中。进入这个状态后,是不能自动唤醒的,必须依靠其他线程调用notify()或notifyAll()方法才能被唤醒。
- 同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入“锁池”中。
- 其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。
Java多线程创建、启动
Java中的多线程你只要看这一篇就够了(里面有高级多线程控制类)
- 继承Thread类,重写该类的run()方法。
- 实现Runnable接口,并重写该接口的run()方法。创建Runnable实现类的实例,并以此实例作为Thread类的target来创建Thread对象,该Thread对象才是真正的线程对象。
Java并发编程Synchronized
Java并发编程 Synchronized及其实现原理(关注synchronize底层原理)
Synchronized的作用主要有三个:
- 确保线程互斥的访问同步代码
- 保证共享变量的修改能够及时可见
- 有效解决重排序问题
Java中每一个对象都可以作为锁,这是synchronized实现同步的基础。
- 普通同步方法,锁是当前实例对象。
- 静态同步方法,锁是当前类的class对象。
- 同步方法块,锁是括号里面的对象。
Synchronize具有可重入性。
synchronized单独使用
在多线程环境下,synchronized块中的方法获取了lock实例的monitor,如果实例相同,那么只有一个线程能执行该块内容。
synchronized、wait、notify结合:典型场景生产者消费者问题
Java多线程学习之wait、notify/notifyAll 详解
wait()、notify/notifyAll() 方法是Object的本地final方法,无法被重写。
wait()使当前线程阻塞,前提是必须先获得锁,一般配合Synchronized关键字使用,即一般在synchronized同步代码块里使用wait()、notify/notifyAll()方法。
由于 wait()、notify/notifyAll() 在synchronized 代码块执行,说明当前线程一定是获取了锁的。
Java并发编程volatile
Java并发编程学习笔记 深入理解volatile关键字的作用
用volatile修饰的变量,线程在每次使用变量的时候,都会读取变量修改后的最的值。volatile很容易被误用,用来进行原子性操作。