Java线程同步

2018/01/02 Java

进程

就绪状态、运行状态、阻塞状态、新建状态、终止状态。

线程

线程的几种状态转换(讲的不错)

就绪状态、运行状态、阻塞状态、新建状态、终止状态。

  • 就绪状态:线程被构建,但未调用start()方法。
  • 运行状态:调用start()方法后。
  • 终止状态:线程运行结束。

阻塞状态分为三种:

  • 等待阻塞:运行的线程执行wait()方法,该线程会释放占用的所有资源,JVM会把该线程放入“等待池”中。进入这个状态后,是不能自动唤醒的,必须依靠其他线程调用notify()或notifyAll()方法才能被唤醒。
  • 同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入“锁池”中。
  • 其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。

Java多线程创建、启动

Java总结篇系列:Java多线程(一)

Java中的多线程你只要看这一篇就够了(里面有高级多线程控制类)

  • 继承Thread类,重写该类的run()方法。
  • 实现Runnable接口,并重写该接口的run()方法。创建Runnable实现类的实例,并以此实例作为Thread类的target来创建Thread对象,该Thread对象才是真正的线程对象

Java并发编程Synchronized

Java并发编程 Synchronized及其实现原理(关注synchronize底层原理)

Synchronized的作用主要有三个:

  • 确保线程互斥的访问同步代码
  • 保证共享变量的修改能够及时可见
  • 有效解决重排序问题

Java中每一个对象都可以作为锁,这是synchronized实现同步的基础。

  • 普通同步方法,锁是当前实例对象
  • 静态同步方法,锁是当前类的class对象
  • 同步方法块,锁是括号里面的对象

Synchronize具有可重入性

Java不可重入锁和可重入锁理解

可重入锁的理解

Java可重入锁如何避免死锁

synchronized锁住的是代码还是对象(是对象)

synchronized单独使用

在多线程环境下,synchronized块中的方法获取了lock实例的monitor,如果实例相同,那么只有一个线程能执行该块内容。

synchronized、wait、notify结合:典型场景生产者消费者问题

Java多线程学习之wait、notify/notifyAll 详解

你真的懂wait、notify和notifyAll吗

wait()、notify/notifyAll() 方法是Object的本地final方法,无法被重写。

wait()使当前线程阻塞,前提是必须先获得锁,一般配合Synchronized关键字使用,即一般在synchronized同步代码块里使用wait()、notify/notifyAll()方法。

由于 wait()、notify/notifyAll() 在synchronized 代码块执行,说明当前线程一定是获取了锁的。

Java并发编程volatile

Java并发编程学习笔记 深入理解volatile关键字的作用

Java中的多线程你只要看这一篇就够了

用volatile修饰的变量,线程在每次使用变量的时候,都会读取变量修改后的最的值。volatile很容易被误用,用来进行原子性操作。

参考

Search

    Table of Contents