黑马程序员——Java之多线程(2)

来源:互联网 发布:淘宝网点击客服没反应 编辑:程序博客网 时间:2024/06/14 02:05

------Java培训、Android培训、iOS培训、Net培训、期待与您交流! ------

 

 一、多线程的同步

       当多个线程操作同一个共享资源时,比如读写同一个变量,存在着资源竞争的问题。为了解决此类问题,需要使用同步机制。这就好比一个人上洗手间,这个人进入洗手间后将门锁上,当他出来时再将锁打开,然后其他让才可以进入。

 

(1)同步代码块

         在Java中提供了同步机制,可以有效地防止资源冲突。同步机制使用synchronizedz关键字。使用同步代码块的目的:阻止两个线程对同一个共享资源进行并发访问。

         同步代码块的语法格式:

synchronizedz(obj)        {           ....           //此处的代码就是同步代码块        }

示例:模拟火车站售票系统。

public class ThreadSafeTest implements Runnable{    //设置当前总票数int num = 10;//重写run()方法,定义了线程的执行体public void run() {while (true) {//同步代码块synchronized ("") {if (num>0) {try {//设定线程睡眠的时间//由于线程休眠时可能被中断,所以需要捕获异常Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("车票还有"+num--+"张");    }}}}public static void main(String[] args) {//实例化类对象ThreadSafeTest t = new ThreadSafeTest();//以该类对象分别实例化4个线程Thread tA = new Thread(t);Thread tB = new Thread(t);Thread tC = new Thread(t);Thread tD = new Thread(t);//分别启动线程tA.start();tB.start();tC.start();tD.start();  }}

运行结果:

车票还有10张车票还有9张车票还有8张车票还有7张车票还有6张车票还有5张车票还有4张车票还有3张车票还有2张车票还有1张

 

(2)同步方法

       当某个对象调用了同步方法时,该对象上的其他同步方法必须等待该同步方法执行完毕才能被执行。必须将每个能访问共享资源的方法修饰为synchronized。

       同步方法就是在方法前面修饰synchronized关键字的方法,其语法格式如下:

synchronizedz  void  f()        {           ....                  }

示例:

public class ThreadSafeTest implements Runnable{    //设置当前总票数int num = 10;//定义同步方法public synchronized void doit(){if(num>0){try {Thread.sleep(10);} catch (Exception e) {e.printStackTrace();}System.out.println("车票还有"+num--+"张");}}//重写run()方法,在run()方法中调用该同步方法public void run() {while (true) {doit();}}public static void main(String[] args) {//实例化类对象ThreadSafeTest t = new ThreadSafeTest();//以该类对象分别实例化4个线程Thread tA = new Thread(t);Thread tB = new Thread(t);Thread tC = new Thread(t);Thread tD = new Thread(t);//分别启动线程tA.start();tB.start();tC.start();tD.start();}}

运行结果:

车票还有10张车票还有9张车票还有8张车票还有7张车票还有6张车票还有5张车票还有4张车票还有3张车票还有2张车票还有1张

 

二、线程的通信

       在讲诉线程与进程的区别时已经讲解过,线程是共享相同的地址空间,并会协作完成一项任务的,因此线程之间必须能够通信。

       Java中提供了wait(),notify()和notifyAll()方法实现了线程间通信机制。这些方法在根类Object中是用final关键字声明的,因此所有的类都包含这些方法。需要说明的是这3个方法仅在synchronized修饰块中才能被调用。

       ①final void wait() throws InterruptedException方法 :通知当前的线程进入睡眠直到其他线程进入调用notify()唤醒它。在睡眠之前,线程会释放掉所占有的“锁标志”,则其占用的所有synchronized代码块可被别的线程使用。
       ②final void notify()方法:唤醒在该同步代码块中第一个调用wait()的线程(即第一个进入休眠状态的线程),并且这时会从线程等待池转移到锁标志等待池中,因为该线程没有立刻获取锁标志。

       ③final void notifyAll()方法:唤醒在该同步代码块中所有调用wait()的线程,并且会从线程等待池中所有该对象的所有线程转移至锁标志等待池中,因为这些线程没有获取锁标。


 

 


 

        

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 2007cad打开时时死机怎么办 手机qq总是无响应怎么办 英雄联盟登录服务器未响应怎么办 苹果7p照相死机怎么办 小米手机qq打不开怎么办啊 电脑qq老是闪退怎么办 微信摄像卡住了怎么办 电脑打开应用程序没反应怎么办 宇飞来手机锁了怎么办 宇飞来手机忘记密码怎么办 vivo手机突然开不了机怎么办 苹果六关不了机怎么办 微信老是无响应怎么办 打游戏被骂了怎么办 微信运动跳转排行榜失败怎么办 小恩爱账号忘了怎么办 华为账号更换后游戏账号怎么办 注册游戏账号需要身份证怎么办 英雄联盟被裁决了怎么办 百度网盘密码重置不了怎么办 sap密码输入被锁怎么办 dnf二级密码错10怎么办 大网卡网速慢了怎么办 小米路由器无线速度慢怎么办 小米手机无线速度慢怎么办 电脑网卡驱动没了怎么办 电脑显示网卡驱动不正常怎么办 微信别人拒收消息怎么办 电脑无线网卡速度慢怎么办 网吧吃鸡更新慢怎么办 手机号注册不了微信怎么办 小米账号密码忘了怎么办 小米手机账号密码忘了怎么办 华为手机账号密码忘记了怎么办 老年机开不了机怎么办 天谕没有顺网登陆怎么办 苹果密保问题忘了怎么办 密保手机没用了怎么办 qq密保手机没用了怎么办 手机开机按钮坏了怎么办 改了账号游戏角色消失怎么办