1、        多线程的同步

2、        同步代码块

即程序中不能有多个线程同时在这两句代码之间执行.(必须两句代码执行完,其他线程才可以公用执行)

同步代码块定义语法如下

...

synchronized(对象)

{需要同步的代码:}

在同一时刻只能有一个线程既可以进入同步代码块内运行,只有当该线程离开同步代码块后后,其他线程才能进入同步代码块内运行.

3、        同步方法

除了同步代码块,也可以同步方法,只要在需要同步的方法定义前面加上关键字synchronized即可.同步方法定义语法如下:

访问控制符 synchronized 返回值类型 方法名称(参数) {...;}

在同一类中,使用synchronized关键字定义的若干方法,可以在多个线程之间同步.当有一个线程进入了有synchronized修饰的方法时,其他线程就不能进入同一个对象使用synchronized来修饰所有方法,知道第一个线程执行完它所进入的synchronized修饰的方法为止.

4、        死锁

要避免死锁,应该确保在获取多个锁时是,在所有的线程中都以相同的顺序获取锁.

5、               线程间通信

Producer类和Consumer类类都是操纵了同一个P类类,这就有可能Producer类还未操纵完P类,Consumer类就将P类中的内容取走了,这就是资源不同步的原因.(name和sex的赋值没有捆绑在一个synchronized的方法中,即是两者可以被赋值时候,可以被其他线程进入)

6、             因为在P类增加两个同步方法:set()和get().可以使对name和sex的赋值进行捆绑同步.但是,两个线程间实际上是没有通信过程的,因为Consumer线程对Producer线程放入的一次数据连续地读去了多次,实际要求的是:Producer放一次数据,Consumer就取一次.

java是通过Object类的wait,notify,notifyAll这几个方法来实现线程间的通信的(任何类可以直接使用这些方法).

wait:告诉当前线程放弃监视器并进入睡眠状态,直到其他进程进入同一监视器并调用notify为止.

notify:唤醒同一对象监视器中调用wait的第一个进程.这类似排队买票,一个人买完之后,后面的人才可以继续买.

notifyAll:唤醒同一对象监视器中调用wait的所有线程,具有最高优先级的线程首先被唤醒并执行.

可以在P类中定义一个bFull来来表示状态.

wait,notify,notifyAll这三个方法只能在synchromized方法中调用,即无论线程调用一个对象的wait还是notify方法,该线程必须先得到该对象的锁标志.这样,notify就只能唤醒同一对象监视器中调用wait的进程.而使用多个对象监视器,就可以分别有多个wait,notify的情况,同组里的notify唤醒.

J2SE知识点摘记(十)的更多相关文章

  1. J2SE知识点摘记(十九)

    Collection 1.2.1         常用方法 Collection 接口用于表示任何对象或元素组.想要尽可能以常规方式处理一组元素时,就使用这一接口.Collection 在前面的大图也 ...

  2. J2SE知识点摘记(十八)

    Java容器类类库的用途是“保存对象”,并将其划分为两个不同的概念: 1)  Collection . 一组对立的元素,通常这些元素都服从某种规则.List必须保持元素特定的顺序,而Set 不能有重复 ...

  3. J2SE知识点摘记(十六)

    1.         IO包中的类层次 ┌BufferedInputStream ├DataInputStream ┌FilterInputStream┼LineNumberInputStream ├ ...

  4. J2SE知识点摘记(十五)

    1.        字节流和字符流的转换 以字符为导向的stream基本上有与之相对应的以字节为导向的Stream,两个对应类实现的功能相同,只是操作时的导向不同 字节输入流转换为字符输入流: Inp ...

  5. J2SE知识点摘记(十四)

    1.        字符流 Reader是定义java的流式字符输入模式的抽象类,该类所有方法在出错的情况下都将引发IOException异常. Int read(char buffer[])     ...

  6. J2SE知识点摘记(十二)

    1.      File类 下面的构造方法可以用来生成File对象 File(String directoryPath) geName()用于返回文件名,getParent()返回父目录名,exist ...

  7. J2SE知识点摘记(二十六)

    为了用“集合框架”的额外部分把排序支持添加到 Java 2 SDK,版本 1.2,核心 Java 库作了许多更改.像 String 和 Integer 类如今实现 Comparable 接口以提供自然 ...

  8. J2SE知识点摘记(二十五)

    Set 1.5.1        概述 Java 中的Set和正好和数学上直观的集(set)的概念是相同的.Set最大的特性就是不允许在其中存放的元素是重复的.根据这个特点,我们就可以使用Set 这个 ...

  9. J2SE知识点摘记(二十四)

     覆写hashCode() 在明白了HashMap具有哪些功能,以及实现原理后,了解如何写一个hashCode()方法就更有意义了.当然,在HashMap中存取一个键值对涉及到的另外一个方法为equa ...

随机推荐

  1. zoj1093 Monkey and Banana

    写到现在,发现1025,1076之前写的都是同一种题型:关于DAG的最长路(最短路). 首先要建立模型,根据关系,确定点和点之间的关系,构成一个DAG,前面几道题每个点之间距离默认为1,这一道题不同点 ...

  2. linux(Ubuntu)下mysql字符集完美解决

    本文参考: 1. http://www.blogjava.net/wldandan/archive/2007/09/04/142669.html 2. http://chinaapp.sinaapp. ...

  3. Android 获取系统图库和相机照片 裁剪并显示

    接上一篇 package com.example.image; import android.app.Activity; import android.content.Intent; import a ...

  4. 在Google map图上做标记,并把标记相连接

    <!DOCTYPE html> <html> <head> <title>GeoLocation</title> <meta name ...

  5. ctype.h 字符分类与转换

      函数及说明 1 int isalnum(int c)该函数检查传递的字符是否是字母数字. 2 int isalpha(int c)该函数是否传递的字符是字母. 3 int iscntrl(int ...

  6. eclipse 改包名

    转载自: http://www.2cto.com/kf/201304/206747.html 1.在项目上右键,选择android tools->rename application packa ...

  7. Delphi检测网络连接状态

    有时候,我们做一些小软件就需要检测网络连接状态,比如想给你的软件加上类似QQ那样的系统消息,可是像我这样的穷人肯定是买不起服务器了,那我们只好另想办法,可以读取网页然后用浏览器显示,这个时候就需要判断 ...

  8. delphi 实现微信开发

    大体思路: 1.用户向服务号发消息,(这里可以是个菜单项,也可以是一个关键词,如:注册会员.) 2.kbmmw web server收到消息,生成一个图文消息给微信,在图文消息中做好自己的url,在u ...

  9. JavaWeb学习—Servlet

    1.什么是Servlet Servlet是一个继承HttpServlet类的Java类 Servlet必须部署在web服务器端,用来处理客户端的请求 2.Servlet运行过程 Web Client ...

  10. Math.round(11.5)等于()Math.round(-11.5)等于()

    几天前去面试,这道简单的题目居然做错了,看来基础就是慢慢积累的.并不断使用和复习才会成为高手,假设基础不是那么熟练.恐怕在成为高手的路上会困难重重.所以在做项目的间歇时间.偶尔回顾一下最基础的知识.是 ...