关于java中的synchronized、wait以及notify和notifyAll
2014-04-08 20:58
429 查看
1.java中多线程同步方法有很多种,可以使用volatile、synchronized同步方法和同步块,以及java内置的一些类和库,如:AtomicInteger类,java.util.concurrent中的类,这些都多提供了同步功能,可以使得在多线程环境中高效而安全的实验我们自己所需要的功能。下面简单介绍synchronized、lock以及notify和notifyAll。
2.首先介绍synchronized,该词的意思是同步的,同步化的。该关键字可用在方法的前面,作为方法的修饰符,可以保证同一时刻只有一个线程执行这个方法,除此之外,还能保证一个类的所有被synchronized修饰的方法中只有一个正在被执行,不会出现在同一时刻不同线程同时在执行这些方法(每个线程执行的是被synchronized修饰的不同的方法)。
另外,还可以用synchronized包围代码块(具体用法请上网查),只要synchronized的同步锁是同一个对象,那么就可以保证这些代码块不会同时被多个线程执行(同一个代码块不会同时被多个线程执行,而且不同代码块也不会被多个线程同时执行)。
3.notify,notifyAll,wait方法必须在该对象的同步代码块内,不然会发生IllegalMonitorStateException异常,实际中需要像下面这样
另外需要说明的是,当调用wait方法后,lock所在的代码块会自动释放所拥有的锁lock对象,并且等待某个线程调用notify或者notifyAll方法后再去获得lock锁,然后继续执行。如果wait中有参数,那么当参数所表示的时间后还没有线程调用notify等方法,那么同步代码块会结束等待,然后继续运行。
4.notify和notifyAll的区别
调用notify方法:只通知所有wait的线程中的一个线程结束等待,至于具体是所有等待线程中的哪一个线程有系统决定。而调用notifyAll方法,所有wait的线程都将结束等待,准备执行。
5.得出上述结论所用到的实验代码如下,希望对理解上面的文字有帮助。
2.首先介绍synchronized,该词的意思是同步的,同步化的。该关键字可用在方法的前面,作为方法的修饰符,可以保证同一时刻只有一个线程执行这个方法,除此之外,还能保证一个类的所有被synchronized修饰的方法中只有一个正在被执行,不会出现在同一时刻不同线程同时在执行这些方法(每个线程执行的是被synchronized修饰的不同的方法)。
另外,还可以用synchronized包围代码块(具体用法请上网查),只要synchronized的同步锁是同一个对象,那么就可以保证这些代码块不会同时被多个线程执行(同一个代码块不会同时被多个线程执行,而且不同代码块也不会被多个线程同时执行)。
3.notify,notifyAll,wait方法必须在该对象的同步代码块内,不然会发生IllegalMonitorStateException异常,实际中需要像下面这样
synchronized (lock) { lock.wait() }
另外需要说明的是,当调用wait方法后,lock所在的代码块会自动释放所拥有的锁lock对象,并且等待某个线程调用notify或者notifyAll方法后再去获得lock锁,然后继续执行。如果wait中有参数,那么当参数所表示的时间后还没有线程调用notify等方法,那么同步代码块会结束等待,然后继续运行。
4.notify和notifyAll的区别
调用notify方法:只通知所有wait的线程中的一个线程结束等待,至于具体是所有等待线程中的哪一个线程有系统决定。而调用notifyAll方法,所有wait的线程都将结束等待,准备执行。
5.得出上述结论所用到的实验代码如下,希望对理解上面的文字有帮助。
public class JavaSynchronization { /** * @param args */ public static void main(String[] args) { final JavaSynchronization instance=new JavaSynchronization(); try { synchronized (instance) { instance.wait(100); } } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } new Thread(new Runnable() { @Override public void run() { instance.methodA(); } }).start(); new Thread(new Runnable() { @Override public void run() { instance.methodB(); } }).start(); } private char share=0; private Object lock=new Object(); public void methodA(){ synchronized (lock) { System.out.println("methodA开始了!"); share='A'; while(true){ try { lock.wait(); System.out.println("methodA又继续了!"); Thread.yield(); } catch (Exception e) { e.printStackTrace(); } if(share!='A'){ System.out.println("methodA结束了!"); return ; } } } } public void methodB(){ synchronized (lock) { System.out.println("methodB开始了!"); share='B'; while(true){ try { // lock.notify(); Thread.yield(); } catch (Exception e) { e.printStackTrace(); } if(share!='B'){ System.out.println("methodB结束了!"); return ; } } } } }
相关文章推荐
- JAVA线程状态以及synchronized,wait,sleep,yield,notify,notifyAll
- JAVA 线程状态以及synchronized,wait,sleep,yield,notify,notifyAll
- JAVA 线程状态以及synchronized,wait,sleep,yield,notify,notifyAll
- 关于synchronized、wait、notify已经notifyAll的使用
- Java多线程之synchronized,wait(),notify(),notifyAll()
- java多线程设计wait、notify、notifyall、synchronized的使用机制
- [java多线程]多线程同步(二)——wait, notify, notifyAll, join以及sleep
- 关于java的synchronized关键字,wait(),notify() 的例子,方便大家快速理解和应用。
- java中wait()、notify()以及notifyAll()的使用
- 关于synchronized、wait、notify已经notifyAll的使用
- Java中的synchronized、Object.wait()、Object.notify()/notifyAll()的使用
- java wait() notify() notifyAll() synchronized关键字总结
- java多线程设计wait、notify、notifyall、synchronized的使用机制
- java线程同步(synchronized,wait,notify,notifyAll)
- multithreading--synchronized对象锁以及对象的notify(),notifyAll(),wait()等的用法
- java线程通讯——使用Lock和Condition代替synchronized 和 wait, notify notifyAll()
- 再谈关于 java 线程,synchronized,wait,notify
- java 中的wait和notify以及synchronized的使用,实现两个线程交替执行
- 关于java中wait()和notify(),notifyAll()方法的理解
- 初探java 对象中wait(),notify(),notifyAll() 和线程中的synchronized