多线程

线程常用方法:
currentThread()方法返回的是当前调用代码的线程。sleep()作用是 使this.currentThread返回的线程休眠(进入等待状态),输入单位为毫秒,sleep()状态遇到中断会抛出InterruptedException异常,并且会清楚中断状态值,使之变为false。
this.interrupt()方法仅仅只是在当前线程中打一个停止标志,并不真正的停止线程。interrupt可以使睡眠的线程苏醒。与return方法配合使用,来真正停止线程。
停止:this.interrupted(), 测试当前线程是否中断,具有清除状态功能
this.isInterrupted(), 测试线程对象是否中断,不清楚状态标志
让线程停止,使用异常法,抛出异常,线程则会终止。
stop()方法,暴力停止线程,已作废,使用stop释放锁,可能会给数据带来不一致问题
线程暂停:suspend方法暂停线程,resume方法恢复线程。已被废弃,使用不当可能造成资源占用,锁未得到释放。以及可能会造成数据不同步的情况。
yield方法的作用是放弃当前的CPU资源,将它让给其他的任务去占用CPU执行时间,但放弃的时间不确定,有可能刚刚放弃,马上又获得CPU时间片。
线程优先级继承性:main线程启动A线程,A线程启动B线程,设置main线程优先级,则A和B的优先级也会与main一起被设置为相同值。
线程优先级的规则性:CPU尽量将执行资源让给优先级比价高的线程。
线程优先级的随机性:具有不确定性。
守护线程:
java线程有两种线程,一个是守护线程,一个是非守护线程。当进程中不存在非守护线程,守护线程也就自动销毁了。
典型的守护线程:垃圾回收线程

首先多个线程访问同一个共享对象,则有可能导致线程安全问题。访问不同的对象,是异步访问,也不会出现线程安全问题。
一个类中既有同步方法,又有非同步方法,那么一个线程调用共享对象的同步方法时,获得了这个共享对象的锁,其他线程这个共享对象的引用就不能调用这个方法,因为获取不到锁,但是可以调用这个对象的非同步方法。
可重入锁:拿到锁的线程,在锁还未释放的时候可以再次获取这个线程的锁。
出现异常的锁被自动释放了,出现异常相当于方法结束,锁自然被释放啊了。
同步不具有继承性,重写的方法需要加synchronized。
不在synchronized块中就是异步执行,在synchroized块中就是同步执行。
synchronized代码块和非synchronized语句是异步的。
当一个线程访问object的一个synchronized代码快时,其他线程对同一个object中所有其他的synchronized(this)同步代码块的访问将被阻塞,因为synchronized使用的是“对象监视器”,synchronized(this)锁的是当前对象。

将任意对象作为对象监视器:这个对象可以是实例变量及方法参数。

在多个线程持有“对象检视器”为同一个对象的前提下,同一时间只有一个线程可以执行synchronized(非this对象x)同步代码块中的代码。
锁非this对象的优点:如果在一个类中有很多个synchronized方法,这是虽然能实现同步,但会受到阻塞,锁非this对象,代码块与同步方法是
异步的,不与其他锁this同步方法争抢this锁,则可大大的提高运行效率。
即持有不同的对象监视器是异步的效果。
synchronized(x)意思是讲x对象作为“对象监视器”,有一下结论:
多个线程同时执行synchronized(x)代码块时,同步。
其他线程执行x对象中synchronized方法时,同步。
其他线程执行x对象方法里面的synchronized(this)代码块时,同步。

静态同步方法与synchronized(class)代码块
是给Class类上锁,使所有静态方法同步。与对象锁区别。Class锁对所有实例的静态方法起作用。
synchronized(class)代码块的作用和synchronized static 方法的作用一样。

常量池对象一般不作为锁对象。
同步synchronized方法无限等待与解决可以用同步代码块来解决。
jstack工具可以用来发现死锁。

锁对象的改变
在将任何数据类型作为同步锁时,需要注意的是,是否有多个线程同时持有锁对象,如果同时持有相同的锁对象,则这些线程之间就是同步的,如果分别获得锁对象,这些线程之间就是异步的。只要对象不变就是同步效果。

volatile
主要作用是使变量多线程间可见。
关键字volatile的作用是强制从公共堆栈中取得变量的值,而不是从线程私有数据栈中取得变量的值。
可以用来解决同步和异步死循环问题。
与synchronized进行比较:
1、只能用于修饰变量
2、多线程访问volatile不会发生阻塞,而synchronized会阻塞
3、可以保证可见性,不能保证原子性。synchronized既可以保证原子性,也可间接保证可见性。
4、volatile关键字是保证变量之间的可见性的,而synchronized关键字是解决多个线程之间访问资源的同步性。
线程安全包括可见性和原子性,java的同步机制都是围绕这两个方面来确保线程安全的。
可以使用原子类来保证线程安全
学习高并发,主要是着重“外联互斥,内修可见”

线程间通信
wait方法使线程停止,notify方法使线程继续。

在调用wait()之前必须获得该对象的对象锁,即只能在同步方法或同步块中调用wait()方法。notify()也一样。
wait()方法使进入临界区的线程进入等待状态(不是阻塞),同时释放被同步对象的锁,进入等待队列中,直到被唤醒。等待的线程如果没有notify将被永远的等待下去。

而notify()操作可以唤醒一个因调用了wait操作而处于阻塞状态中的线程,使其进入就绪状态。被重新唤醒的线程会试图重新获得临界区的控制权,也就是锁,并继续执行。
notify()通知的时候,如没有处于等待状态的线程,则该命令会被忽略。notify方法执行后不立即释放锁,执行完synchronized方法体(块)后才释放锁。
notify方法通知一个线程,notifyAll方法通知所有等待同意共享资源的锁。
当线程呈wait()状态时,调用线程对象的interrupt方法会出现异常(wait中的线程中断会抛出InterruptedException)。
wait(long):等待某一时间内是否有线程对锁进行唤醒,如果超过这个时间则自动唤醒。
notify()要避免过早通知(即不能先于wait通知),否则可能无效。

----------------生产者消费者问题-------
一个消费者一个生产者:生产者、消费者、生产者任务(死循环执行run方法)、消费者任务(死循环执行run方法)、值。生产者、消费者
多生产者多消费者:为避免假死,使用notifyAll
生产者和消费者:操作数栈。一对一(操作栈、P、C、pTask,cTask),一对多(使用while循环判断,和notifyall解决假死问题),多对一(无),多堆多(无)

join()方法:使所属的线程执行完run()方法里面的任务,使当前线程(如main)阻塞,等所属的线程销毁后在继续执行当前线程的代码。具有使线程排队等待的作用。join内部使用wait方法进行等待。在join过程中,如果当前线程对象被中断,则当前线程出现异常。具有释放锁的特点。
join把指定的线程加入当前线程,可以将交替执行的两个线程合并为顺序执行的线程。
join(long):join最大的等待时间,内部是用wait(long)来实现,具有释放锁的特点。

-----------------第四章--------------------
lock接口:lock() unlock()方法,手动加锁,解锁。
Condition类:lock.newCodition(), 一个lock对象可以创建多个Condition对象,从而实现有选择性的通知,每个Condition对象的notifyAll只通知使用这个对象.await()的方法。
await()、await(long) 方法调用之前必须使用lock()方法获取监视器
signal、signalAll
实现生产者、消费者模式,生产者、消费者、值都放在一个Service里面

利用同一个lock对象关联的多个Condition可以实现通知部分线程。

-----------------第五章--------------------
Timer类主要负责计划执行任务。
TimerTask类是封装任务的类,抽象类,需要继承。

java高并发编程

------------------------------简书学习----------------------------------
https://www.jianshu.com/p/d53bf830fa09

使用Synchronized进行同步,其关键就是必须要对对象的监视器monitor进行获取,当线程获取monitor后才能继续往下执行,否则就只能等待。而这个获取的过程是互斥的,即同一时刻只有一个线程能够获取到monitor。
这就是锁的重入性,即在同一锁程中,线程不需要再次获取同一把锁。Synchronized先天具有重入性。每个对象拥有一个计数器,当线程获取该对象锁后,计数器就会加一,释放锁后就会将计数器减一。
Synchronized锁太消耗资源,需要优化。
CAS(无锁策略):乐观锁 (V, O, N) 真实值、旧值、新值
CAS的实现需要硬件指令集的支撑,在JDK1.5后虚拟机才可以使用处理器提供的CMPXCHG指令实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值