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. Android动画之硬件加速

    你的动画写出来卡嘛?流畅嘛 如果你想提升动画的性能,那就是用它-hardware layers. During animations your views may be redrawn each fr ...

  2. Android 旋转字体 实现(应用角标,如:新,火等关键字)

    在安卓应用中常见应用图标,或者gridview ,listview每个条目上有新,火,等45度旋转的字体,然后一个红色背景,引起用户关注,来一下实现方式: 自定义一个textview,绘制字体的时候, ...

  3. python 学习day6(面向对象)

    博客部分内容转自:http://www.cnblogs.com/wupeiqi/p/4493506.html 面向对象编程介绍 为什么要用面向对象进行开发? 面向对象的特性:封装.继承.多态 类.方法 ...

  4. Static Function Test

    public class StaticTestCls { public int x = 0; public static int y = 0; private void SetValue_Object ...

  5. WIN ERROR:C:\Windows\System32\<LANG_NAME>\mstsc.exe.MUI

    Issue: When you upgrade Win7, you may found your remote desktop will not work. You may get following ...

  6. java 书籍推荐 JavaEE程序员必读图书大推荐

    java 书籍推荐 JavaEE程序员必读图书大推荐 转自:http://www.cnblogs.com/xlwmin/articles/2192775.html 下面是我根据多年的阅读和实践经验,给 ...

  7. VS2015 开发人员命令提示,如何实现记事本编程

    开始,选择VS2015 开发人员命令提示,打开 找到.c文件的位置,复制位置 在VS2015 开发人员命令提示, 输入cd 位置 回车 然后输入cl 文件名 回车 这样进行编译

  8. Android——采用SQLiteDatabase操作SQLite数据库

    除了能够使用文件或SharedPreferences存储数据.还能够选择使用SQLite数据库存储数据. 在Android平台上,集成了一个嵌入式关系型数据库-SQLite,SQLite3支持 NUL ...

  9. cocos2d-x for wp8 设置横竖屏

    在主project文件(xxx.cpp , xxx为你的项目名)中, 函数名为void xxx::SetWindow(CoreWindow^ window) 相关代码片例如以下: <pre na ...

  10. varnish和squid的对比

    Varnish与Squid的对比  说到Varnish,不能不提Squid,Squid是一个高性能的代理缓存服务器,它和varnish之间有诸多的异同点,这里分析如下:  下面是他们之间的相同点:   ...