java并发之线程间通信

1、volatile 关键字

java 支持多个线程同时访问一个对象或对象的成员变量,而每个线程拥有这个变量的拷贝,虽然对象或成员变量分配的内存在共享内存,但每个执行的线程可以拥有一份拷贝,可以提高程序的执行效率,所以多线程看到的变量不一定是最新的。

volatile关键字可以保证程序对变量的每次读取都从共享内存读取,而对它的改变也必须同时刷新到共享内存。从而保证所有线程对变量访问的可见性。

但是过多的使用volatile关键字,会影响程序的执行效率。所以要谨慎使用

2、synchronized 关键字

synchronized可以修饰方法或者代码块,可以确保多个线程同一时刻只有线程处于方法或者同步快中。

synchronized本质是对对象的监视器(monitor)进行获取,而这个获取过程是排他性的。

3、 对象上的wait/notify

在当前线程执行对象的wait和notify方法,当前线程必须获取对象的监视器,如果没有获取对象的监视器,会报java.lang.IllegalMonitorStateException。一般的代码框架为

 synchronized (object){
            try {
                object.wait();
            }catch (InterruptedException e){
                e.printStackTrace();
            }
        }

  synchronized (object){
            object.notify();
  }

执行object.wait()方法时,线程释放object的锁,然后将自己置于object监视器的等待队列;执行object.notify()方法,通知对象等待队列中的一个线程,使该线程由等待队列变为对象的监视器的同步队列,然后该线程尝试去获取object的监视器,获取后线程才能继续执行。

注意notify方法并没有释放对象的监视器,只是通知对象等待队列中一个对象由等待状态变为同步状态,等 synchronized 代码块执行完后,监视器才会释放

4、ThreadLocal

5、join

6、yield

7、sleep

8、intertupt()

原文地址:https://www.cnblogs.com/graph/p/6832727.html