---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------

(回顾)

多线程导致安全问题的原因:

l  多个线程访问出现延迟

l  线程随机性

ps:线程安全问题在理想状态下,不容易出现,但一旦出现对软件的影响是非常大的

解决多线程安全问题的方法------同步synchronized

格式

synchronized(对象){需要同步的代码;}

同步可以解决安全问题的根本原因就在那个对象上,该对象如同锁的功能

同步的前提:

l  同步需要两个或两个以上的线程

l  多个线程使用同一把锁

为满足这两个条件,不能称其为同步

同步的弊端:

当线程相当多时,每个线程都会去判断同步上的锁,这是很耗资源的,无形中会降低程序的运行效率

同步函数:

格式:在函数上加上synchronized 修饰符即可

一般函数用的锁是this

静态同步函数用的锁是所在类的Class对象,即字节码文件对象

线程状态:

New新建状态

Runnable可运行(就绪)状态

Running运行(正在运行)状态

Block阻塞(挂起)状态

Dead死亡状态

七.线程间通信

多个线程在操作同一个资源,但是操作的动作不同。

线程间通信---等待唤醒机制

public final void wait()throwsInterruptedException

public final void notify()

public final void notifyAll()

这三个函数都是用在同步中,因为要持有监视器(锁)的线程操作

思考:wait(),notify(),notifyAll()用来操作线程的方法为什么定义在了Object类中?

因为这些方法在操作同步中,线程同步都需要标识他们所操作线程持有的锁,只有同一个锁上被等待的线程,可以被同一个锁的notify唤醒,不可以对不同所中的线程进行等待唤醒。也就是说,等待和唤醒必须是同一个锁,所以要使用在同步中,因为只有同步才具有锁。

一言以蔽之,调用这些函数的对象是锁,锁可以使任意对象,所以这些方法一定要定义在Object类中。

wait和sleep的区别:

1.wait定义在Object类中,被锁调用,sleep定义在Thread类中,被线程调用

2.wait之后持锁线程进入Block状态,放锁,sleep之后线程进入Block状态,不放锁

3.wait之后需要notify或notifyAll唤醒,sleep之后时间到了会自动醒来进入Runnable状态

wait和sleep都声明抛出了中断异常

jdk1.5版本是Java一个里程碑式的改革,对于线程通信来说,将隐式的锁机制改成了显示的锁机制。

解决线程安全问题使用的同步形式,实际上就是锁机制。

而线程同步过程中,获取锁或者是释放锁,只有锁是最清楚的,所以将锁封装成了一个对象,就是Lock对象。

在jdk1.5以后的版本中,将Lock定义成一个接口,位于java.util.concurrent.locks包中。

public interfaceLock

而且,又定义了一些类直接实现这个接口

public classReetrantLock extends Object implements Lock,Serializable

public staticclass ReentrantReadWriteLock.ReadLock extends Object implementsLock,Serializable

public staticclass ReentrantReadWriteLock.WriteLock extends Object implementsLock,Serializable

这三个类实现了Lock接口

Lock接口中用void lock()获取锁,用void unlock()释放锁

在线程通信的等待唤醒机制中,原来用来等待和唤醒的功能wait、notify、notifyAll方法位于Object类中,现在变成await()、signal、signalAll封装在Condition对象中。

Condition也是一个接口,要创建某个锁对应的condition对象,应该这么定义

Lock lock = newRerntrantLock();

Condition c =lock.newCondition();

c.await();

c.signal();

八.多线程常用API

Thread中常用的API有

static Thread currentThread();返回当前正在运行的线程

String getName() 返回该线程的名称

boolean isDaemon() 测试该线程是否为守护线程

void setDaemon() 将该线程设置为守护线程,需在启动线程前调用

void join() 在当前运行的线程中临时加入一个线程

void setPriority() 设置当前线程的优先级

int getPriority() 获得线程的优先级

static void sleep(long millis) 使该线程放弃执行权,进入休眠,时间到自动转醒

void interrupt() 中断线程

示例:

//主线程
class ThreadDemo
{public static void main(String[] args) {//定义临界资源Resource res = new Resource();//定义两个线程负责存入和取出,并启动/*    Deposit d = new Deposit(res);Remove r = new Remove(res);Thread deposit = new Thread(d);Thread remove = new Thread(r);deposit.start();remove.start();*/new Thread(new Deposit(res)).start();new Thread(new Remove(res)).start();System.out.println("main over");}
}//定义临界资源
class Resource
{int goodsItem = 0;boolean isEmpty = true;public void deposit(){while(goodsItem<100){synchronized(this){while (!isEmpty)try{wait();}catch (InterruptedException e){}System.out.print("in:"+goodsItem+" ");goodsItem++;isEmpty = false;notify();}}}public void remove(){while(goodsItem<100){synchronized(this){while (isEmpty)try{wait();}catch (InterruptedException e){}System.out.println("out:..........."+goodsItem);isEmpty = true;notify();}}}
}
//定义存入线程运行代码
class Deposit implements Runnable
{private Resource res = null;Deposit(Resource res){this.res = res;}public void run(){res.deposit();}
}
//定义取出线程运行代码
class Remove implements Runnable
{private Resource res = null;Remove(Resource res){this.res = res;}public void run(){res.remove();}
}

用Lock修改示例如下:

import java.util.concurrent.locks.*;
//主线程
class ThreadDemo
{public static void main(String[] args) {//定义临界资源Resource res = new Resource();//定义两个线程负责存入和取出,并启动/*    Deposit d = new Deposit(res);Remove r = new Remove(res);Thread deposit = new Thread(d);Thread remove = new Thread(r);deposit.start();remove.start();*/new Thread(new Deposit(res)).start();new Thread(new Remove(res)).start();System.out.println("main over");}
}//定义临界资源
class Resource
{int goodsItem = 0;boolean isEmpty = true;Lock lock = new ReentrantLock();Condition con = lock.newCondition();public void deposit(){while(goodsItem<100){lock.lock();try{while (!isEmpty)con.await();System.out.print("in:"+goodsItem+" ");goodsItem++;isEmpty = false;con.signal();}catch(Exception e){}finally{lock.unlock();}}}public void remove(){while(goodsItem<100){lock.lock();try{while (isEmpty)con.await();System.out.println("out:..........."+goodsItem);isEmpty = true;con.signal();}catch(Exception e){}finally{lock.unlock();}}}
}
//定义存入线程运行代码
class Deposit implements Runnable
{private Resource res = null;Deposit(Resource res){this.res = res;}public void run(){res.deposit();}
}
//定义取出线程运行代码
class Remove implements Runnable
{private Resource res = null;Remove(Resource res){this.res = res;}public void run(){res.remove();}
}

---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------

黑马程序员------毕老师视频笔记第十二天------多线程(3)相关推荐

  1. 黑马程序员------毕老师视频笔记第22天------图形化编程(2)

    ---------------------- ASP.Net+Unity开发..Net培训.期待与您交流! ---------------------- 鼠标事件.键盘事件 这两个事件应该是所有组件都 ...

  2. 黑马程序员------毕老师视频笔记第五天------面向对象(封装)

    ---------------------- ASP.Net+Unity开发..Net培训.期待与您交流! ---------------------- 封装:是指隐藏对象的属性和实现细节,仅对外提供 ...

  3. 黑马程序员------毕老师视频笔记第23-24天------网络编程(1)

    ---------------------- ASP.Net+Unity开发..Net培训.期待与您交流! ---------------------- 一概述 java对网络编程的支持很强.网络通信 ...

  4. 黑马程序员------毕老师视频笔记第七天------面向对象(模板方法设计模式)

    ---------------------- ASP.Net+Unity开发..Net培训.期待与您交流! ---------------------- 模板方法设计模式:定义功能时,功能的一部分是确 ...

  5. 黑马程序员------毕老师视频笔记第13-17天------集合Collection-Set-(HashSet、TreeSet)

    ---------------------- ASP.Net+Unity开发..Net培训.期待与您交流! ---------------------- Collection中除了List之外还有一个 ...

  6. 黑马程序员------毕老师视频笔记第18-21天------IO输入与输出(2)

    ---------------------- ASP.Net+Unity开发..Net培训.期待与您交流! ---------------------- 本篇包含几个示例,分别说明字符流(Buffer ...

  7. 黑马程序员------毕老师视频笔记第七天------面向对象(抽象类)

    ---------------------- ASP.Net+Unity开发..Net培训.期待与您交流! ---------------------- 当多个类中出现了相同的功能,但是功能主体不同, ...

  8. 黑马程序员------毕老师视频笔记第六天------面向对象(对象初始化过程)

    ---------------------- ASP.Net+Unity开发..Net培训.期待与您交流! ---------------------- Person p = new Person(& ...

  9. 黑马程序员------毕老师视频笔记第22天-----图形化编程(GUI)(1)

    ---------------------- ASP.Net+Unity开发..Net培训.期待与您交流! ---------------------- 用户与计算机交互有两种方式:命令行,图形化界面 ...

最新文章

  1. sklearn 朴素贝叶斯分类示例
  2. 小程序的ui应该怎么设计?
  3. CF359D:Pair of Numbers(数论)
  4. Verilog初级教程(3)Verilog 数据类型
  5. Java_apply_in_automatic_system
  6. 25个国外优秀电子商务网站设计案例
  7. FreeBSD上安装Cassandra 3.10
  8. QTP之对测试用例的自动化过程的分解
  9. java数据结构-Vector
  10. 基于android平台的24点游戏设计与实现需求分析,基于Android平台的24点游戏设计与实现需求分析_毕业设计论文.doc...
  11. RequestMapping注解的继承问题
  12. 如何在同一地方组建多个 ZigBee 网络
  13. 江苏省秋c语言二级用什么软件,在哪里可以查到江苏省计算机c语言二级考试资料?...
  14. 大一作业HTML网页作业:中华传统文化题材网页设计5页(纯html+css实现)
  15. 应用程序正常初始化失败(0xc0000135)
  16. 一个简单的java代码,输入当前星期,输出今天是星期几
  17. HTML5中国象棋游戏源代码
  18. STM32单片机学习笔记(七)-RCC时钟控制:简单了解时钟树(一)
  19. 服务器系统启用来宾用户,系统日志中出现Internet来宾账户
  20. 鸿蒙之下分城如果建设,率土之滨:分城数量不再限制,戍城、金虎台、拜将台让战斗更激烈...

热门文章

  1. 基于GIS的校园公交车管理系统设计(西安电子科技大学GIS课程大作业)
  2. Ubuntu14.04 蓝牙适配器的连接
  3. 电脑技巧:教你关闭Win11内存压缩,解决电脑卡顿的问题
  4. CS269I:Incentives in Computer Science 学习笔记:Lecture 7 Selfish Routing(自利寻径网络超额配置)
  5. CSS3实现缺角矩形
  6. 三星新技术使WiFi提速5倍:每秒传输575MB数据
  7. DOVE-----Vue.js框架入门(八)
  8. 程序设计基础(CC++) 戴波、张东祥 第五章 指针 编程作业
  9. 插画人物怎么画?人体动态结构怎么画?
  10. ThinLTO:可扩展及增量的LTO