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

一些概念:

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

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

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

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

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

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

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

当一段代码或数据对象用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. background-position还可以这样用

    文章同步至微信公众号:http://mp.weixin.qq.com/s?__biz=MzAxMzgwNDU3Mg==&mid=401626453&idx=1&sn=6af07 ...

  2. 移动端click事件延迟300ms的原因以及解决办法

    这要追溯至 2007 年初.苹果公司在发布首款 iPhone 前夕,遇到一个问题 —— 当时的网站都是为大屏幕设备所设计的.于是苹果的工程师们做了一些约定,应对 iPhone 这种小屏幕浏览桌面端站点 ...

  3. 开启macbook win7触控屏右键

    开启macbook win7触控屏右键,如下图

  4. html 报表导出excel防止数字变科学计数

    在html 标签加:  <html xmlns:x="urn:schemas-microsoft-com:office:excel">    在要导出的tr加:  &l ...

  5. Centos apache + mysql + usvn 配置svn 服务器

    1.遇到问题 提交异常:'svn/!svn/me'path not found http://www.myexception.cn/cvs-svn/1262826.html 更改http.conf 配 ...

  6. c++学习笔记01-输入输出流&&文件输入输出操作

    const int size=50等于#define size 50 字符串默认以0结尾: 一.输入输出流 cin.get()会从输入中取走一个字符: cin.peek()会从输入中检测第一个字符: ...

  7. 第5章 LINQ

    5.4 LINQ查询运算符 using System; using System.Collections.Generic; using System.Linq; using System.Text; ...

  8. maxiang.io css

    /**设置你自己的CSS.例如:h1 { border-bottom: 1px solid #ccc; line-height:1.6;}body { background:#FDFFD0} **/p ...

  9. Light OJ 1031 - Easy Game(区间dp)

    题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1031 题目大意:两个选手,轮流可以从数组的任意一端取值, 每次可以去任意个但仅 ...

  10. [C#][.net 4]Task 代码示例

    using System; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; name ...