博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java多线程编程chap1-2
阅读量:6147 次
发布时间:2019-06-21

本文共 2003 字,大约阅读时间需要 6 分钟。

第一章:Java多线程技能

使用多线程

  • 实现多线程有两种方式:继承Thread类、实现Runnable接口
  • Thread.java中的start()方法是异步执行,thread.run是同步;而且start()方法的顺序不代表线程启动的顺序,它是随机的。
  • 在方法前加synchronized可以让线程安全。

一些方法

  • currentThread() 返回代码段正在被哪个线程调用
  • isAlive() 判断当前线程是否处于活动状态
  • sleep() 让线程休眠
  • getID() 获得线程的唯一标志
  • yield() 让当前线程放弃cpu资源,但时间不确定

停止线程

方式:

  • 使用退出标识,使线程正常退出,也就是当run方法完成后线程退出
  • 使用interrupt方法中断线程

第二种方式要注意:

  • interrupt() 实例方法,让线程中断,再用异常法检测中断使程序停止
  • interrupted()是静态方法,测试当前线程是否已经是中断状态,执行后具有将状态标志清除为false的功能。
  • isInterrupted()是实例方法,测试Thread对象是否已经是中断状态,但不清除状态标志。
  • 如果在sleep状态下停止某一线程,会进入catch语句(不需要判断是否中断),并且清除停止状态,使它变为false.

线程的优先级

getPriority()查看优先级,setPriority()设置优先级,有1~10级 线程优先级的特点:

  • 继承性: 如过线程A启动线程B,则B和A优先级一样
  • 规则性: CPU尽量倾向于把资源优先级高的线程
  • 随机性: 优先级不等同于执行顺序,优先级较高的不一定先执行完

守护线程

Java的线程分为两种:User Thread(用户线程)、Daemon Thread(守护线程)。

当最后一个非守护线程结束时,守护线程随着JVM一同结束工作。Daemon作用是为其他线程提供便利服务,守护线程最典型的应用就是GC(垃圾回收器),它就是一个很称职的守护者。

第二章:对象及变量的并发访问

synchronized同步方法

  • 方法内的变量为线程安全,而实例变量非线程安全。
  • 不同线程调用同一对象里的synchronized方法时,是同步的(排队进行)。也就是必须等线程执行完synchronized方法时,下一线程才能执行synchronized方法。
  • 可重入锁: 一个线程得到对象锁后,再次请求此对象锁时是可以得到该对象的锁的。子类也可以调用父类的同步方法。
  • 出现异常,锁自动释放
  • 子类方法不会继承synchronized关键字,需要手动在子类方法中加上。

synchronized同步语句块

  • 多个线程处理同一个对象的synchronized(this)同步语句块时,只能排队执行
  • 同一个对象的synchronized(this)synchronized同步方法之间也是同步的。即同一时间只有一个线程可执行synchronized代码块或方法中的代码
  • synchronized(非this对象x),是将x对象作为“对象监视器”
    • 当多个线程同时执行synchronized(x){}同步代码块时呈同步效果
    • 当其他线程执行x对象中synchronizd同步方法时呈同步效果
    • 当其他线程执行x对象方法里的synchronized(this)代码块时呈同步效果
  • 静态同步 synchronized方法与synchronized(class)代码块是对Class类进行持锁。
  • 当线程在等带根本不可能被释放的锁是,就会出现死锁。
  • 如果同时持有相同的锁对象,线程之间就是同步的。注意对象的属性改变,运行结果还是同步的。

volatile关键字

volatile: 强制的从公共内存进行取值,而不是从线程私有数据栈中取得变量的值。可以使变量在多个线程间可见,但缺点是不支持原子性。

synchronizedvolatile比较:

  • 关键字volatile是线程同步的轻量级实现,所以volatile性能比synchronized好,并且volatile只能修饰变量,而synchronized可修饰方法和代码块。
  • 多线程访问volatile不会发生阻塞,而synchronized会出现阻塞
  • volatile能保证数据可见性,不保证原子性;synchronized可以保证原子性,也可以间接保证可见性,因为synchronized会将私有内存和公共内存中的数据做同步。
  • volatile解决的是变量在多个线程间的可见性,synchronized解决的是多个线程访问资源的同步性(互斥加可见)。

原子类:

AtomicBooleanAtomicIntegerAtomicLong等。一个原子类型就是一个原子操作可用的类型,可在没有锁的情况下做到线程安全。但原子类的方法间的调用却不是原子的,需要用同步。

转载地址:http://vfxya.baihongyu.com/

你可能感兴趣的文章
建筑电气暖通给排水协作流程
查看>>
JavaScript面向对象编程深入分析(2)
查看>>
linux 编码转换
查看>>
POJ-2287 Tian Ji -- The Horse Racing 贪心规则在动态规划中的应用 Or 纯贪心
查看>>
Windows8/Silverlight/WPF/WP7/HTML5周学习导读(1月7日-1月14日)
查看>>
关于C#导出 文本文件
查看>>
使用native 查询时,对特殊字符的处理。
查看>>
maclean liu的oracle学习经历--长篇连载
查看>>
ECSHOP调用指定分类的文章列表
查看>>
分享:动态库的链接和链接选项-L,-rpath-link,-rpath
查看>>
Javascript一些小细节
查看>>
禁用ViewState
查看>>
Android图片压缩(质量压缩和尺寸压缩)
查看>>
nilfs (a continuent snapshot file system) used with PostgreSQL
查看>>
【SICP练习】150 练习4.6
查看>>
HTTP缓存应用
查看>>
KubeEdge向左,K3S向右
查看>>
DTCC2013:基于网络监听数据库安全审计
查看>>
CCNA考试要点大搜集(二)
查看>>
ajax查询数据库时数据无法更新的问题
查看>>