线程同步

来源:互联网 发布: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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 淘宝禁止评价一个月怎么办 被卖家电话骚扰怎么办 恶意骚扰扣12分怎么办 新店开张交保证金被骗了怎么办 支付宝蚂蚁花呗逾期怎么办 被注销的微信怎么办 花呗有些不能用怎么办 实体店生意不好做怎么办 电器实体店生意越来越差怎么办 开业第一天不吉利怎么办 美容店开业第一天没人怎么办 淘宝店铺没有人访问怎么办 淘宝店铺没有人问怎么办 淘宝申请退款后店铺关闭怎么办 宝贝详情怎么改不了怎么办 改详情页后被删除宝贝怎么办 淘宝网商贷生意不好还不了怎么办 英国遗失在酒店物品怎么办 班福法则首位是0怎么办 同事能力比你强怎么办 新买的木板床响怎么办 笔记本键盘驱动坏了怎么办 云柜快递超时了怎么办 毕业设计被老师发现抄的怎么办 地板颜色太深了怎么办 皮质鞋子破皮了怎么办 吃了蜘蛛丝会怎么办 南京高二分班不公平怎么办? 高中分班考试没考好怎么办 实木门上的伸缩缝太深怎么办 mac点关机没反应怎么办 被压倒扁的易拉罐怎么办 白色车漏底漆了怎么办 客厅对着卧室门怎么办 老公不上进还懒怎么办 二胡按弦手指分不开怎么办 酷塑做完后疼痛怎么办 冷冻治疗后水泡破了怎么办 冷冻治疗的水泡破了怎么办? 冷冻治疗水泡破了怎么办 脚上冷冻后起泡怎么办