38.1 线程安全
38.2 同步技术
synchronized(任意对象){
线程要操作的共享数据;
}
38.3 同步代码块原理
38.4 同步方法
public synchronize void xxxx{
......
}
- 非静态同步方法锁对象是本类对象的引用this
- 静态同步方法锁对象是类名.class
38.5 Lock接口
void lock(); //获取锁
void unlock(); //释放锁
38.6 死锁
public class DeadLock implements Runnable{
private int i = 0;
public void run(){
while(true){
if(i%2==0){
synchronized (LockA.locka) {
System.out.println("if...locka");
synchronized (LockB.lockb) {
System.out.println("if...lockb");
}
}
}else{
synchronized (LockB.lockb) {
System.out.println("else...lockb");
synchronized (LockA.locka) {
System.out.println("else...locka");
}
}
}
i++;
}
}
38.7 等待唤醒机制
void wait(); //键盘输入的时候...
void notify(); //任意唤醒一个
void notifyAll();
38.8 等待唤醒机制的案例演示
public class Resource {
public String name;
public String sex;
public boolean flag = false;
}
public class Input implements Runnable {
private Resource r ;
public Input(Resource r){
this.r = r;
}
public void run() {
int i = 0 ;
while(true){
synchronized(r){
if(r.flag){
try{r.wait();}catch(Exception ex){}
}
if(i%2==0){
r.name = "Jack";
r.sex = "man";
}else{
r.name = "Rose";
r.sex = "woman";
}
r.flag = true;
r.notify();
}
i++;
}
}
}
public class Output implements Runnable {
private Resource r ;
public Output(Resource r){
this.r = r;
}
public void run() {
while(true){
synchronized(r){
if(!r.flag){
try{r.wait();}catch(Exception ex){}
}
System.out.println(r.name+".."+r.sex);
r.flag = false;
r.notify();
}
}
}
}
public class ThreadDemo{
public static void main(String[] args) {
Resource r = new Resource();
Input in = new Input(r);
Output out = new Output(r);
Thread tin = new Thread(in);
Thread tout = new Thread(out);
tin.start();
tout.start();
}
}
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man
Rose..woman
Jack..man