java并发基础

线程优先级

针对频繁阻塞(休眠或者IO操作)的线程需要高优先级,而偏重计算的线程,应该时低优先级,从而保证处理器不会被独占。
在不同jvm和操作系统上,线程规划会存在差异,有些甚至会忽略。

线程状态

NEW
RUNNING:又分为运行中和就绪,通过yield()可以从运行中变为就绪
BLOCKED:阻塞于锁或者synchronized
WAITING:等待状态,通过wait()或者join(),等待notify或者interrupte
TIME_WAITING:超时等待,sleep(time),join(time),wait(time)
TERMINATED:终止,线程的run方法执行完毕。

守护线程Daemon

主线程结束,jvm退出。Daemon不影响。

启动线程start():将线程的状态从新建转换为就绪

中断

中断是一个标识位,其他线程调用interrupt()就是将这个标识改为true。
如果在wait()或者sleep()时,将会抛出异常。

线程间通信

volatile和synchronized关键字

volatile保证线程读到的是最新的数据。
synchronized保证同一时刻只有一个线程在操作同步代码块。

如果监视器锁是偏向锁或者轻量级锁时就不加入同步队列,而是使用cas,只有重量级锁才会加入同步队列

synch是通过一个互斥的监视器锁来实现的,每个对象都有一个监视器锁。只有线程获得这个监视器锁之后才能进入同步块。而没有获得的线程进入阻塞状态并且加入监视器的同步队列。
在这里插入图片描述

等待/通知机制:将一个对象当作一个具有等待队列和同步队列的锁

等待/通知的相关方法是任意java对象具备的,因为这些方法被定义在了Object上。
使用过程:两个线程A和B,A中调用了Object的wait()方法,进入wait()的等待状态,B调用notify()会随机唤醒一个wait()方法,如果A被唤醒,则从wait()方法返回,从等待状态进入就绪();

  1. 使用wiat()和notify()需要先对调用对象加锁。
  2. 调用wait()方法后,线程将从running变为wait,并且将当前线程放入对象的等待队列,并且释放Object的监视器锁。
  3. 当notify被调用后,仍然不会从wait()返回,只有当notify()的线程结束同步代码块或者释放监视器锁之后,等待线程才有机会从wait()返回。
  4. wait()方法返回的条件是获得了监视器锁。
调用wait():放弃监视器锁并且加入Object的等待队列
调用notify():随机从Object的等待队列中选择一个线程放入同步块队列,此时这个幸运的加入了同步队列的线程变为阻塞状态
notifyThread释放锁,此时在同步队列中的阻塞线程获取锁之后从wait()返回并且running状态
notify和wait必须用synch加在当前对象(即this)

wait()会释放sych的监视器锁,所以wait是和监视器锁持有对象紧密相连的。

Thread.join()的使用

线程A执行thread.join(),当前线程A等待thread线程终止之后才从thread.join()返回。

应用

实现等待超时模式:主要利用了wait(时间)

public synchronized Object get(long mills) throws InterruptedException{
	long future=System.currentTimeMillis()+mills;
	long remaining = mills;
	while((result==null)&&remaining>0){
		wait(remaining);
		remaining=future-System.currentTImeMillis();
	}
		return result;
}
  • 25
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值