java多线程的理解

线程的5种状态:新建,就绪,运行,阻塞,死亡。

Thread.sleep:线程  运行状态 转为  阻塞状态。

Thread.yield:   线程 运行状态 转为 就绪状态。

ThreadA.join:等待ThreadA执行完成。

线程的两种方式:

继承自Thread,实现Runnable.

在线程中看是否有操作的同一对象的实例。如果有的话要考虑线程的同步和互斥。通俗点来说就是某个类的某个成员变量会有多个线程访问。

线程的同步

同步代码块:同步加锁的是对象,而不是代码。

synchronized(Object A){

}

同步监视器是A,表示的是一个临界区。

同步方法:

synchronized Method1(){

}

synchronized Method2(){

}

同步锁:

Lock lock = new ReentrantLock();

public Mehtod1(){

lock.lock();

finally{

     lock.unlock();

}

}

public Mehtod2(){

lock.lock();

finally{

     lock.unlock();

}

}

同步监视器的释放:

1.当前线程的同步方法或者同步代码块执行结束,当前线程即释放同步监视器。

2.在同步方法或者同步代码块中出现了error或者exception的时候。

3.当线程执行同步方法或者同步代码块时,程序执行了同步监视器对象的wait方法,则当前线程,并释放同步监视器。

下面的情况不会释放同步监视器:

1.当线程执行同步方法或者同步代码块时,程序调用Thread.Sleep,Thread.Yield方法。

2.当线程执行同步方法或者同步代码块时,其他线程调用了该线程的suspend方法将该线程挂起。

线程的通信:

同步方法块或者同步方法使用object的wait,notify和notifyAll三个方法来进行线程的通信。

如果是同步方法块synchronized(Object a):则在代码中要使用a.wait,a.notify,a.notifyAll;

如果使用的是同步方法synchronized methodA(),则同步监视器是this对象,可以直接在代码中使用wait,notify和notifyAll方法。

wait:导致当前的线程等待,并且释放当前的同步监视器。直到其他线程调用该同步监视器的notify方法和notifyall方法。

notify:唤醒在此监视器上等待的单个线程,但是选择是任意的。

notifyAll:唤醒在同步监视器上等待的所有线程。

原文地址:https://www.cnblogs.com/lxzh/p/2859931.html