这个课题提出来的是原先的线程并发解决的思路。目前解决线程并发,可以是lock接口结合condition  并发问题一直以来就是线程必不可少的话题。

java 是第一个内置对多线程支持的主流编程语言。在Java5之前,对多线程的支持主要是通过对块结构的同步实现的(synchronized配合wait,notify,notifyAll),Java5引入了java.util.concurrent包,提供了对多线程编程的更高层的支持。

今天我们来说说。java中,线程提供我们解决并发。同步的方法

  通常可以使用synchronized和notify,notifyAll以及wait方法来实现线程之间的数据传递及控制。对于对象obj来说:

  • obj.wait():该方法的调用,使得调用该方法的执行线程(T1)放弃obj的对象锁并阻塞,直到别的线程调用了obj的notifyAll方法、或者别的线程调用了obj的notify方法且JVM选择唤醒(T1),被唤醒的线程(T1)依旧阻塞在wait方法中,与其它的线程一起争夺obj的对象锁,直到它再次获得了obj的对象锁之后,才能从wait方法中返回。(除了notify方法,wait还有带有时间参数的版本,在等待了超过所设时间之后,T1线程一样会被唤醒,进入到争夺obj对象锁的行列;另外中断可以直接跳出wait方法)
  • obj.notify():该方法的调用,会从所有正在等待obj对象锁的线程中,唤醒其中的一个(选择算法依赖于不同实现),被唤醒的线程此时加入到了obj对象锁的争夺之中,然而该notify方法的执行线程此时并未释放obj的对象锁,而是离开synchronized代码块时释放。因此在notify方法之后,synchronized代码块结束之前,所有其他被唤醒的,等待obj对象锁的线程依旧被阻塞。
  • obj.notifyAll():与notify的区别是,该方法会唤醒所有正在等待obj对象锁的线程。(不过同一时刻,也只有一个线程可以拥有obj的对象锁)

要注意的是,wai,notify以及notifyAll方法的调用必须在相应的synchronized代码块之中

线程就是程序执行的路径。多线程,也就不难理解了,程序执行的多条路径,它们独立执行,但是又有莫大的联系

wait/notify字面意思是等待和告知

package com.huojg.test;

public class ThreadA {
public static void main(String[] args) {
ThreadB b = new ThreadB();
b.start();// 主线程中启动另外一个线程
System.out.println("b is start....");
// 括号里的b是什么意思,应该很好理解吧
synchronized (b) {
try {
System.out.println("Waiting for b to complete...");
b.wait();// 这一句是什么意思,究竟谁等待?
System.out.println("ThreadB is Completed. Now back to main thread");
} catch (InterruptedException e) {
} }
System.out.println("Total is :" + b.total);
}
} class ThreadB extends Thread {
int total; public void run() {
synchronized (this) {
System.out.println("ThreadB is running..");
for (int i = 0; i <= 100; i++) {
total += i;
}
System.out.println("total is" + total);
notify();
}
}
}
b is start....
ThreadB is running..
total is5050
Waiting for b to complete...
ThreadB is Completed. Now back to main thread
Total is :5050

从程序运行的结果来看就不难理解wait/notify了,wait是让使用wait方法的对象等待,暂时先把对象锁给让出来,给其它持有该锁的对象用,其它对象用完后再告知(notify)等待的那个对象可以继续执行了,整个过程就是这样。wait/notify主要用于一个线程要等待另一个线程执行完后,然后得到执行结果的情况。

为什么 java wait/notify 必须与 synchronized 一起使用,jvm究竟做了些什么的更多相关文章

  1. JAVA wait(), notify(),sleep详解

    转自: http://blog.csdn.net/zyplus 在JAVA中,是没有类似于PV操作.进程互斥等相关的方法的.JAVA的进程同步是通过synchronized()来实现的,需要说明的是, ...

  2. JAVA wait(), notify(),sleep具体解释

    在CSDN开了博客后,一直也没在上面公布过文章,直到前一段时间与一位前辈的对话,才发现技术博客的重要,立志要把CSDN的博客建好.但一直没有找到好的开篇的主题,今天再看JAVA线程相互排斥.同步的时候 ...

  3. Java多线程总结之由synchronized说开去(转)

    这几天不断添加新内容,给个大概的提纲吧,方面朋友们阅读,各部分是用分割线隔开了的: synchronized与wait()/notify() JMM与synchronized ThreadLocal与 ...

  4. Java多线程总结之由synchronized说开去

    更新完毕,结贴,以后有新的想法再开新帖 这几天不断添加新内容,给个大概的提纲吧,方面朋友们阅读,各部分是用分割线隔开了的: synchronized与wait()/notify() JMM与synch ...

  5. 面试突击24:为什么wait和notify必须放在synchronized中?

    在多线程编程中,wait 方法是让当前线程进入休眠状态,直到另一个线程调用了 notify 或 notifyAll 方法之后,才能继续恢复执行.而在 Java 中,wait 和 notify/noti ...

  6. 【Java并发编程实战】-----synchronized

    在我们的实际应用当中可能经常会遇到这样一个场景:多个线程读或者.写相同的数据,访问相同的文件等等.对于这种情况如果我们不加以控制,是非常容易导致错误的.在java中,为了解决这个问题,引入临界区概念. ...

  7. Java中的ReentrantLock和synchronized两种锁定机制的对比

    问题:多个访问线程将需要写入到文件中的数据先保存到一个队列里面,然后由专门的 写出线程负责从队列中取出数据并写入到文件中. http://blog.csdn.net/top_code/article/ ...

  8. java多线程之内存可见性-synchronized、volatile

    1.JMM:Java Memory Model(Java内存模型) 关于synchronized的两条规定: 1.线程解锁前,必须把共享变量的最新值刷新到主内存中 2.线程加锁时,将清空工作内存中共享 ...

  9. Java中的Lock与synchronized

    并发编程学习笔记之Lock与synchronized 一.什么是可重入锁 Lcok在Java中是一个接口,一般在面试问题中问到的可能是ReentrantLock与synchronized的区别.Ree ...

随机推荐

  1. Ubuntu 16.04将系统时间写入到硬件时间BIOS

    说明:在Ubuntu中为了和Windows保持一致,会将系统时间设置成CST的,所以下面的说法是设置成UTC的问题是由于所在的环境不一致导致的,本章只讨论如何设置时间到BIOS,不做时区分析,下面忽略 ...

  2. js封装的一行半显示省略号。(字数自由控制)

    $(function() { //控制一行半隐藏 (function ($) { $.fn.displayPart = function (opts) { $(this).each(function ...

  3. Java算法题:求素数

    题目:判断101-200之间有多少个素数,并输出所有素数. 思路:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数. 具体代码: public Ve ...

  4. http://blog.csdn.net/emoven/article/details/12999265

    http://blog.csdn.net/emoven/article/details/12999265

  5. Solr 创建core 从MySql数据库中导入数据

    一.创建数据表和数据 在MySql数据中创建mysolrInfo表, 创建字段 id 主键,自动增加 pname :姓名 age :年龄 addtime :增加时间 增加几条数据 二.创建core 当 ...

  6. 2017.7.21 linux下进程管理工具supervisord的安装与使用

    参考来自:http://blog.haohtml.com/archives/15145 0 操作环境 1 supervisord的介绍 Supervisord是用Python实现的一款非常实用的进程管 ...

  7. 转: 理解UDDI (from IBM Dev)

    from: http://www.ibm.com/developerworks/cn/webservices/ws-featuddi/index.html 何为 UDDI? UDDI 项目鼓励 Web ...

  8. 什么是ICE (Internet Communications Engine)

    http://user.qzone.qq.com/77811970 直接在google上搜索ICE,出来的结果并不多,所以很多人就认为ICE是个神秘的东西,其实,国内已经有很多大型应用在使用ICE了. ...

  9. android-SQLite数据库MVC关联实例源码(三层架构)

    前两天布置下了一个期末练习,其中的重点是两个表之间的SQLite关联操作. 拿到题目,首先需要建库和关联表,下面是代码. 我使用简单的表插入,将数据的提交卸载onCreate方法中,这样不会发生写在主 ...

  10. python——变量作用域及嵌套作用域

    ----------------------------------------------------------------------------- 前言-------------------- ...