线程同步
来源:互联网 发布:sql中with as的用法 编辑:程序博客网 时间:2024/05/02 02:19
对象的锁:在并发环境下,解决共享资源冲突问题时,可以考虑使用锁机制。
每一个对象都有一把锁。只有获得对象的锁才可以执行同步代码块或者同步函数。
对象锁机制在同一时间只保证一个线程访问方法或变量。
在java语言中,通过被关键字synchoronized修饰的方法或synchronized语句块实现对代码的同步包含在synchronized方法或语句块中 代码称为被同步的代码(Synchronized Code),当线程访问被同步的代码时,必须首先竞争代码所属的类的对象上的锁,否则线程将等待(阻塞),直到锁被释放。
Java实现同步的两种机制,同步代码块和同步方法。
//同步代码块
synchronized(obj)
{
}
//同步方法
public synchronized void method()
{
}
/* * 张三、李四合租了一间房间,早上张三先起床进入卫生间刷牙,然后李四后起床,在门口等待 * 张三刷完牙出来,李四进入卫生间刷牙,张三在门口等待洗脸 * 李四刷完牙,张三进入卫生间洗脸,李四在门口等待。张三洗脸完,李四进入卫生间洗脸 * * 如何使用java的多线程的同步机制来描述上述情形 */class MyRoomThread extends Thread{static MyRoomThread zhangsan = new MyRoomThread("张三");//张三static MyRoomThread lisi = new MyRoomThread("李四");//李四private String name;//住户的名字static Object toliet = new Object();//卫生间MyRoomThread(String name){this.name =name;}@Overridepublic void run() {//只有获得卫生间的锁,才能使用卫生间的临界资源try {synchronized (toliet) {if (this.name.equals("张三")) {this.brush();//张三先刷牙toliet.wait();//张三在门口等待,张三释放在卫生间的锁this.face();//李四刷完牙,张三洗脸toliet.notify();//释放对象的锁,让李四洗脸}else {this.brush();//李四刷牙toliet.notify();//释放卫生间的锁,让张三洗脸toliet.wait();//李四在门口等待洗脸this.face();}}} catch (Exception e) {}}public void brush() throws Exception{System.out.println(this.name+"正在刷牙。。。");Thread.sleep(2000);System.out.println(this.name+"刷牙完毕离开。。。");}public void face() throws Exception{System.out.println(this.name+"正在洗脸。。。");Thread.sleep(2000);System.out.println(this.name+"洗脸完毕离开。。。");}}public class MyThreadDemo {public static void main(String[] args) {MyRoomThread.zhangsan.start();//张三先上卫生间MyRoomThread.lisi.start();}}
输出结果:
张三正在刷牙。。。张三刷牙完毕离开。。。李四正在刷牙。。。李四刷牙完毕离开。。。张三正在洗脸。。。张三洗脸完毕离开。。。李四正在洗脸。。。李四洗脸完毕离开。。。
/* * 妈妈有两个孩子,分别是大林和小林 * 暑假妈妈买了50跟冰棍放进冰箱,大林和小林每天放学回家都吃冰棍 * 使用java多线程来描述上述问题,统计大林和小林各吃了多上冰棍 */class IceStream implements Runnable{private int iceStreamNum;//冰棍的数量public int bigNum;//大林吃的数量public int smallNum;//小林吃的数量public boolean flag = true;//控制线程是否结束的开关变量public IceStream(int iceStreamNum){this.iceStreamNum = iceStreamNum;}//吃冰棍的方法public synchronized void eatIceStream() throws Exception{if (iceStreamNum <= 0) {flag = false;return;}iceStreamNum--;if (Thread.currentThread().getName().equals("大林")) {bigNum++;System.out.println("大林吃了一根冰棍,还剩"+iceStreamNum+"根。");Thread.sleep(200);}else {smallNum++;System.out.println("小林吃了一根冰棍,还剩"+iceStreamNum+"根。");Thread.sleep(200);}}@Overridepublic void run() {while(flag){try {eatIceStream();//不停吃冰棍} catch (Exception e) {}}}//统计各吃了多少根public void showResult(){System.out.println("大林吃了:"+bigNum+"根。");System.out.println("小林吃了:"+smallNum+"根。");}}public class IceStreamDemo {public static void main(String[] args) {IceStream ic = new IceStream(5);Thread bigSon = new Thread(ic, "大林");Thread smallSon = new Thread(ic, "小林");bigSon.start();smallSon.start();//等待线程结束,统计结果try {bigSon.join();smallSon.join();ic.showResult();} catch (Exception e) {}}}
输出结果:
大林吃了一根冰棍,还剩4根。大林吃了一根冰棍,还剩3根。大林吃了一根冰棍,还剩2根。小林吃了一根冰棍,还剩1根。小林吃了一根冰棍,还剩0根。大林吃了:3根。小林吃了:2根。
0 0
- 线程同步--线程同步--线程同步--线程同步--线程同步
- 线程同步
- 线程同步
- 线程同步
- 线程同步
- 线程同步
- 线程同步
- 线程同步
- 线程同步
- 线程同步
- 线程同步
- 线程同步
- 线程同步
- 线程同步
- 线程同步
- 线程同步
- 线程同步
- 线程同步
- 编译QT程序出现virtual memory exhausted: Cannot allocate memory
- HDU1518:Square(DFS)
- NetBeans+xdebug解决无法连接xdebug问题
- NetBeans 运行php文件 提示无法通过外部浏览器访问URL 检查浏览器配置
- MongoDB 数据导入 mongoimport
- 线程同步
- mysql笔记5---一些常用函数
- Oracle SYSTEM表空间说明
- MySQL bug:server-id默认被自动置为1
- Lidan随笔记(原)
- 一天掌握HTML
- 单生产单消费多生产多消费问题的解决及使用机制
- HDU3715 2-SAT
- jQuery 遍历 (笔记)