线程间的共享和协作

线程间的共享和协作

  • 线程间的共享
    • synchronized 内置锁
    • volatile 关键字,最轻量级的同步机制
    • ThreadLocal
      • ThreadLocal 使用
  • 线程间的协作
    • 等待/通知机制
    • 等待通知的标准范式

线程间的共享

synchronized 内置锁

  synchroniezd 可以修饰方法或者以同步块的方式使用。它可以确保多个线程在同一时刻,只能有一个线程处于方法或者同步代码块中,保证了线程对于变量的访问的可见性与排他性,又称之为内锁机制。
对象锁和类锁:
   对象锁是用于对象实例方法,或者一个对象实例上的,类锁是用于类的静态方法或者一个类的 class 对象上的。
  类锁只是一个概念上的东西,并不是真实存在的,类锁其实锁的是每个类的对应的 class 对象。类锁和对象锁之间也是互不干扰的。

volatile 关键字,最轻量级的同步机制

volatile 保证了不同线程对于这个变量进行操作时的可见性。 即一个线程修改了某变量的值,这个新值对于其他线程来说时立即可见的。试用场景:一个线程写,多线程读。

ThreadLocal

ThreadLocal 为每个线程提供了变量的副本,使得每个线程在某一时间访问的并非同一对象,隔离了多个线程间的数据共享。

ThreadLocal 使用

void set(Object value) 设置当前线程的局部变量。
public Object get() 返回当前线程所对应的线程局部变量。
public void remove() 将当前线程局部变量的值删除。
protected Object initialValue() 返回该线程局部变量的初始值。

线程间的协作

等待/通知机制

notify(): 通知一个在对象上等待的线程,使其从 wait 方法返回,而返回的前提是该线程获取到了对象的锁,没有获得锁的线程重新进入 WAITING 状态。
notifyAll(): 通知所有等待在该对象上的线程
wait():调用该方法的线程进入 WAITING 状态,只有等待另外线程的通知或被中断
才会返回.需要注意,调用 wait()方法后,会释放对象的锁
wait(long): 超时等待一段时间,这里的参数时间是毫秒,也就是等待长达n 毫秒,如果没有通知就超时返回
wait (long,int) : 对于超时时间更细粒度的控制,可以达到纳秒

等待通知的标准范式

等待方遵循如下原则:
1)获取对象的锁。
2)如果条件不满足,那么调用对象的 wait()方法,被通知后仍要检查条件。
3)条件满足则执行对应的逻辑。

synchroniezd(对象)  {
		while(条件不满足)  {
				对象.wait();
		}
		对应的处理逻辑
}

通知方遵循如下原则。
1)获得对象的锁。
2)改变条件。
3)通知所有等待在对象上的线程。

synchroniezd(对象)  {
		改变条件
		对象.notifyAll();
}

在调用 wait()、notify()系列方法之前,线程必须要获得该对象的对象级
别锁,即只能在同步方法或同步块中调用 wait()方法、notify()系列方法.

notify 和 notifyAll 应该用谁?
  尽可能用 notifyall(),谨慎使用 notify(),因为 notify()只会唤醒一个线程,我
们无法确保被唤醒的这个线程一定就是我们需要唤醒的线程。

你可能感兴趣的:(学习总结笔记)