J2SE知识点摘记(十)
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知识点摘记(十)的更多相关文章
- J2SE知识点摘记(十九)
Collection 1.2.1 常用方法 Collection 接口用于表示任何对象或元素组.想要尽可能以常规方式处理一组元素时,就使用这一接口.Collection 在前面的大图也 ...
- J2SE知识点摘记(十八)
Java容器类类库的用途是“保存对象”,并将其划分为两个不同的概念: 1) Collection . 一组对立的元素,通常这些元素都服从某种规则.List必须保持元素特定的顺序,而Set 不能有重复 ...
- J2SE知识点摘记(十六)
1. IO包中的类层次 ┌BufferedInputStream ├DataInputStream ┌FilterInputStream┼LineNumberInputStream ├ ...
- J2SE知识点摘记(十五)
1. 字节流和字符流的转换 以字符为导向的stream基本上有与之相对应的以字节为导向的Stream,两个对应类实现的功能相同,只是操作时的导向不同 字节输入流转换为字符输入流: Inp ...
- J2SE知识点摘记(十四)
1. 字符流 Reader是定义java的流式字符输入模式的抽象类,该类所有方法在出错的情况下都将引发IOException异常. Int read(char buffer[]) ...
- J2SE知识点摘记(十二)
1. File类 下面的构造方法可以用来生成File对象 File(String directoryPath) geName()用于返回文件名,getParent()返回父目录名,exist ...
- J2SE知识点摘记(二十六)
为了用“集合框架”的额外部分把排序支持添加到 Java 2 SDK,版本 1.2,核心 Java 库作了许多更改.像 String 和 Integer 类如今实现 Comparable 接口以提供自然 ...
- J2SE知识点摘记(二十五)
Set 1.5.1 概述 Java 中的Set和正好和数学上直观的集(set)的概念是相同的.Set最大的特性就是不允许在其中存放的元素是重复的.根据这个特点,我们就可以使用Set 这个 ...
- J2SE知识点摘记(二十四)
覆写hashCode() 在明白了HashMap具有哪些功能,以及实现原理后,了解如何写一个hashCode()方法就更有意义了.当然,在HashMap中存取一个键值对涉及到的另外一个方法为equa ...
随机推荐
- MySQL如何使用索引 较为详细的分析和例子
在数据库表中,使用索引可以大大提高查询速度. 假如我们创建了一个 testIndex 表: CREATE TABLE testIndex(i_testID INT NOT NULL,vc_Name V ...
- C语言 —— 括号配对问题(不使用栈)
最近在南阳理工的OJ上刷题,看到一个有点意思的题目 网上的答案大多都使用了栈,可惜我还没有学习数据结构,所以只能用简单的方法来解决 题目的链接在这 http://acm.nyist.net/Judge ...
- DirectUI实现原理
一,概念 传统的Windows窗口程序对每一个控件都会创建一个句柄,而DUI技术奖所有控件都绘制在一个窗体上,这些控件的逻辑和绘图方式必须自己进行编写和封装,所以这些控件都是无句柄的. DUI技术的实 ...
- poj3062---输入什么输出什么
#include <stdio.h> #include <stdlib.h> int main() { ]; while(gets(str) != NULL) { printf ...
- poj2924---高斯求和
#include <stdio.h> #include <stdlib.h> int main() { ; long long ans,a,b; scanf("%d& ...
- UVA 116 Unidirectional TSP 经典dp题
题意:找最短路,知道三种行走方式,给出图,求出一条从左边到右边的最短路,且字典序最小. 用dp记忆化搜索的思想来考虑是思路很清晰的,但是困难在如何求出字典序最小的路. 因为左边到右边的字典序最小就必须 ...
- 使用after伪类清除浮动
使用after伪类清除浮动 .department li:after{ content:"."; height:0; visibility:hidden; display:bloc ...
- 基于Linux 3.0.8 Samsung FIMC(S5PV210) 的摄像头驱动框架解读(一)
作者:咕唧咕唧liukun321 来自:http://blog.csdn.net/liukun321 FIMC这个名字应该是从S5PC1x0開始出现的.在s5pv210里面的定义是摄像头接口.可是它相 ...
- MessageQueue
MessageQueue myQueue = new MessageQueue(".\\private$\\myQueue"); try { Message myMessage = ...
- NeatUpload上传控件在asp.net中的使用
1.先导包,Brettle.Web.NeatUpload.dll导进web层中,再添加到vs控件中. 2.把NeatUpload文件夹放到根目录下. 3.直接拉要用到的控件到页面上,在使用 <U ...