首页 > 代码库 > java线程安全2

java线程安全2

1 线程通信

java.lang.Object提供两个用于线程通信的方法:

wait()

                执行该方法的线程释放对象锁.把该线程放到对象等待池中.

notify(

                执行该方法的线程唤醒在对象的等待池中的一个线程.JVM从对象等待池中随机选择一个线程,把它转移到对象锁池中,

 

*t1线程 t2线程共同操作一个对象.

两个线程可以通过s对象的wait()和notify()方法通信.

t1线程执行对象s的一个同步代码块,t1线程持有s的锁.t2线程在锁池中等待.

*t1线程在同步代码块中执行s.wait()

t1线程释放对象s的锁,进入对象等待池.

*在对象s的锁池中,等待锁t2线程获得了对象s的锁.执行s对象另一个同步代码块.

*t2线程在同步代码块中执行s.notify()

jvm把t1线程从对象s的等待池.移到对象s的锁池.在那里等待获得锁.

*t2线程执行完同步代码块,释放锁,t1线程获得锁.继续执行同步代码块.

 

 

只有在锁池中的线程才有机会获得对象的锁.执行同步代码块.

如果需要获得对象锁.线程需要从等待池--移动-->锁池--进一步-->获得对象锁

 

释放对象锁:

在以下情况会释放对象锁,持有锁的线程会释放对象锁.

*执行完同步代码块就会释放锁.

*在执行同步代码块过程中遇到异常会导致线程终止.锁也会被释放

*在执行同步代码块过程中.执行锁所属对象wait()

这个线程会释放锁.进入对象等待池中.

 

如何测试一个方法是线程安全的

 

一个线程执行临界区代码过程如下

1 获得同步锁

2 清空工作内存.

3 从主内存拷贝变量到工作内存

4 对这些变量计算

5 将变量从工作内存写到主内存

6 释放锁

 

A的等待是主动放弃锁

B等待时候还要提醒A放鸡蛋

声明了一个盘子只能放一个鸡蛋