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. javaweb一周总结(菜鸟)

    我的试用期开始了. 这是我的第一篇博客,这也是我作为java工程师的第六天,主要是为了记录一周内出现的问题以及一些工作上的解答,吐槽一句工作的确和想的不一样之后直接记录下吧. 由于拥有工作平台看不到底 ...

  2. linux 下访问mysql

    1:先进到root:/# /usr/local/mysql/bin/2:root:/# mysql -u root -p     Enter password:

  3. 关于在页面上执行sql语句

    在页面上执行sql语句,首先在页面上顶一个文本域,让用户输入需要执行的sql语句. html代码如下: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML ...

  4. 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换算法(android)

    final double x_pi = 3.14159265358979324 * 3000.0 / 180.0; public GeoPoint bd_encrypt(GeoPoint point) ...

  5. axis2 webservices 411错误解决办法

    错误:org.apache.axis2.AxisFault: Transport error: 411 Error: Length Required 可能会导致这个问题的原因: 1.访问地址经过端口映 ...

  6. ab压力测试报错: apr_socket_recv: Connection reset by peer (104)

    使用ab对网站进行压力测试,开始设置并发500,可以正常使用,当设置并发为1000,则报错: apr_socket_recv: Connection reset by peer (104) 改服务端a ...

  7. 用gdb调试程序笔记: 以段错误(Segmental fault)为例

    用gdb调试程序笔记: 以段错误(Segmental fault)为例[转] 1.背景介绍2.程序中常见的bug分类3.程序调试器(如gdb)有什么用4.段错误(Segmental fault)介绍5 ...

  8. instance variables may not be placed in categories

    Avoid Properties in Categories Objective-C分类中是不允许增加成员变量的(Instance variables may not be placed in cat ...

  9. MySQL存储过程的基本函数

    (1).字符串类 CHARSET(str) //返回字串字符集 CONCAT (string2 [,... ]) //连接字串 INSTR (string ,substring ) //返回subst ...

  10. [置顶] 【IOS】IOS7 UI适配

    昨天下了把手机升级成了IOS7 正式版,然后下了最新的xocde5.  试着编译了一下刚刚完成的几个应用,还好问题不大,半个小时的时间都适配好了,然后改了下几个新出现的warning.过几天等空了,要 ...