一直以为自己动多线程,使用过好像就懂了原理一样,其实是按部就班的写自己不知道原理的代码而已。

一些概念:

监视器:将监视器比作一个建筑,建筑里面有个特别的房间,房间中有一些数据,这些数据在同一个时间只能被一个线程占据。当一个线程进入到离开这个房间之前可以单独享有这些数据。

进入建筑---进入监视器

进入建筑的那个房间---获得监视器

占据房间---持有监视器

离开房间---释放监视器

离开建筑---退出监视器

结合线程的状态理解这些动作,再好的描述也不能表达出来对这些东西的感觉,只可意会。

当一段代码或数据对象用synchronize修饰时,这段代码或者数据就相当于建筑立面那个特别的房间,同一个时刻只能被一个线程享有,其他想占据这个房间的线程都按照一些规则排序,等里面的线程出去,或者“休息”的状态才能得逞~

持有监视器的线程在wait()暂时退出监视器,进入等待状态,先暂时的离开,一会还会回来。

notify()后不影响代码执行,当前线程暂停或者执行完成后,等待的线程会继续持有监控器。

一个简单的栗子

package studythread;

public class WaitAndNotify {
class TestWait extends Thread{
public void run(){
test("wait线程" );
}
}
class TestNotify extends Thread{
public void run(){
test("notify线程");
}
} public void exe(){
TestWait tw = new TestWait();
tw.start();
TestNotify tn = new TestNotify();
tn.start();
} //监视器
public synchronized void test(String str){ for(int i=0 ; i<10 ; i++){
if(i == 5){
try { wait();
} catch (InterruptedException e) { e.printStackTrace();
}
}else{
notify();
}
System.out.println(str +"-------------"+ i);
}
} public static void main(String[] args) {
new WaitAndNotify().exe();
}
}

wait() notify()搭配synchronize的使用的更多相关文章

  1. 如何证明sleep不释放锁,而wait释放锁?

    wait 加锁示例 public class WaitDemo { private static Object locker = new Object(); public static void ma ...

  2. ***Java多线程发展简史

    http://blog.jobbole.com/28297/ 本文来自四火的博客(@RayChase),由@_Zhijun 推荐 这篇文章,大部分内容,是周五我做的一个关于如何进行Java多线程编程的 ...

  3. [转] Java多线程发展简史

    这篇文章,大部分内容,是周五我做的一个关于如何进行Java多线程编程的Knowledge Sharing的一个整理,我希望能对Java从第一个版本开始,在多线程编程方面的大事件和发展脉络有一个描述,并 ...

  4. java并发之ReentrantLock学习理解

    简介 java多线程中可以使用synchronized关键字来实现线程间同步互斥,但在jdk1.5中新增加了ReentrantLock类也能实现同样的效果,并且在扩展功能上也更加强大,比如具有嗅探锁定 ...

  5. Java多线程之ReentrantLock与Condition

    一.ReentrantLock 1.ReentrantLock简介 ReentrantLock是一个可重入的互斥锁,又被称为“独占锁”.ReentrantLock 类实现了 Lock ,它拥有与 sy ...

  6. java Concurrent包学习笔记(三):ReentrantLock

    一.可重入性的理解 从名字上理解,ReenTrantLock的字面意思就是再进入的锁,其实synchronized关键字所使用的锁也是可重入的,两者关于这个的区别不大.两者都是同一个线程每进入一次,锁 ...

  7. ansible-playbook剧本

    Playbooks 是一种简单的配置管理系统与多机器部署系统的基础, 非常适合于复杂应用的部署 由 yaml 语言编写, 运行过程中, ansible-playbook 命令根据自上而下的顺序依次执行 ...

  8. Java并发之等待/通知机制

    目录 1 前言 1.1 先来段代码放松一下 2 Object wait()/notify() 2.1 一段入门代码 2.2 问题三连击 a.为什么官方说wait() 要放在while里面? b.为什么 ...

  9. java线程的五大状态,阻塞状态详解

    一.状态简介 一个线程的生命周期里有五大状态,分别是: 新生 就绪 运行 死亡 运行后可能遇到的阻塞状态 二.相关方法 2.1 新生状态 Thread t = new Thread(); 正如我们前面 ...

随机推荐

  1. 大毕设-matlab-AM调制解调

    博主大毕设关于数字下变频(DDC)的CUDA实现,预计工期比较长,所以留下一些文字记录. 主要分为两部分工作,Matlab仿真部分和CUDA实现. 由于很久没有仿真了,所以先用一个简单的AM调制仿真练 ...

  2. Angularjs学习笔记(五)----显示和格式化数据

    一.引用指令 在AngularJS的文档中,所有指令的名字以驼峰命名法.而在模板中,则需要以蛇形命名法.可以以冒号分割(ng:model)或下划线分割(ng_model),更常见的是以ng-model ...

  3. 西门子Prodave5.5使用说明及VC示例

    西门子PLC的通信协议主要是PPI.MPI.Profibus.CP243/CP343/CP443 网络协议,prodave是早期完成的程序接口,除了网络协议外其它的主要协议都支持,SoftNet是西门 ...

  4. swift 之 闭包

    一.闭包 格式:{  (  参数名:类型, 参数名:类型 ..  )   in 内容体  return  返回值   }  最完整的闭包 1.省略参数类型 {  (  参数名, 参数名..  )   ...

  5. 第七章 consul docker集群

    --net=host:运行consul的docker镜像必须带有的参数,因为consul的consensus和gossip协议对于网络的延迟和丢包很敏感,所以引入额外的其他网络类型的层是不可取并且不必 ...

  6. Android新建数据库和建表demo

    public class DBHelper extends SQLiteOpenHelper{ public final static String DATABASENAME ="diary ...

  7. JQUERY删除操作

    var path = '<%=request.getContextPath()%>/baseReorganizeController/deleteBaseReorganize';      ...

  8. JavaWeb 学习008-今日问题(非空验证尚未解决) 2016-12-2

    1. 学生模块list页面 不能正常跳转 说是找不到stuid属性,但是我在entity里面和数据库建表的属性就是stuid:Grade模块代码一样,却可以正常运行 这是什么问题? <c:for ...

  9. php中ajax调用出错的问题

    最近用一些php,客户的使用jquery ajax的时候经常报错 ajax报错内容:readyState:4 status:"OK",statusText:"OK&quo ...

  10. hdu 5534 (完全背包) Partial Tree

    题目:这里 题意: 感觉并不能表达清楚题意,所以 Problem Description In mathematics, and more specifically in graph theory, ...