学习java并发编程实战(一)

书籍是人类进步的阶梯,java并发编程实战这本书应该不是中国人的阶梯,目前读到第六章总体感觉这本书写的很不错跟java多线程编程核心技术不是同一档次。里面讲述的知识点有些感觉比较冗余有些感觉讲的又不够清楚,可能是个人理解能力有限吧,总体来说这本书还是很有研究的必要的。
目前读到第六章线程池,感觉东西有点多并且很乱因此记下来方便后面用到的时候查阅,当时会不代表以后也会,因为长时间用不到尤其是一些不常见的并发容器或者关键字就会淡忘,正题开始:
1、为什么加锁,锁住的是什么?
当有多个线程同时访问一个共享变量时,一部分线程对它进行写操作,一部分线程做读操作,这时读到的数据有可能就是旧数据也就是行话说的脏数据;当有多个线程访问两个不同的变量时,并且两个变量之间是有关联关系时,多个线程进行读写操作就会打破原有的两个变量之间的关联关系。在访问或操作共享变量时适当加锁就会防止这种情况的发生,使数据保持一致性。锁(synchronized)可以作用在代码块上或者方法上;作用在代码块上需要明确指出锁定的对象是谁,作用在方法上时,需要判断有没有static关键字,若是静态方法锁住的对象就是.class,若不是静态方法锁住的对象就是this。一旦对象被锁住,一段时间内只能有一个线程访问该对象,访问完成后才能让新线程去访问,保证同一时间片下只有一个线程操作对象。这个过程可以理解为一个商店只有一个门每次直接待一个客人,客人进商店后将门锁住,其他人就进不去了,当进去的客户买完所需物品时才会出来,这时下一个客户才能进入商店并锁门防止其他客户进入。
2、线程优先级、线程关键字
线程可以设置优先级,一般来说优先级越高执行的几率越大但不是绝对的因为优先级再低的情况下也会被选中执行,线程的优先级用1-10之间的整数表示,数值越大优先级越高,默认的优先级为5,方法是setPriority。守护线程和普通线程的区别是只有普通线程结束后守护线程才会结束,类似于守护线程是普通线程的服务员,只要有一个普通线程在服务员都要工作,只有普通线程全部结束,jvm退出时,守护线程才会结束。比如jvm的gc处理线程就是一个守护线程,注意main只是一个普通线程,很长一段时间内我都认为main是守护线程。线程关键字synchronized、volatile、sleep、yield、join、wait、notify、notifyAll。
synchronized表示锁的概念不再赘述;
volatile表示内存可见性,多个线程访问内存时都会复制一份在自己的内存下操作,操作完成后再同步到共享内存中,使用volatile关键字强迫线程每次读写都使用共享内存,这样保证数据的可读性,一般用于状态判断,但不推荐使用于复杂逻辑中,因为不能保证原子性。double和long需要使用volatile关键字才能保证原子性,他们在jvm中都是按照64位计算的,会被拆分成两个32位进行处理。
sleep表示线程停顿,sleep方法传入的是毫秒单位,数据类型是long,需要catch异常。sleep操作不会释放线程所持有的的锁,sleep时间过后会接着向下执行。
yield表示让步,当一个线程执行yield方法时表示放弃此处持有锁的机会,与同级别的优先级线程再次竞争看谁能获得锁谁就先执行,因此yield方法不一定会让步有可能它会再次获得锁。
join表示等待线程执行完,在多线程操作中有时候需要等待另一线程先执行完再执行下面的操作,这个时候使用join就是一个好的选择,他可以让执行这个方法的线程先执行完再向下执行。
wait表示线程等待,网上常常拿wait和sleep进行比较,wait执行时已经释放锁资源,并且wait是object的方法,通常与notify、notifyall配合使用,通常一个线程等待一个线程就要被唤醒,常用于生产者和消费者模式,生产者生产出资源后进行wait操作并唤醒消费者去消费资源。
notify和notifyall的区别是唤醒单个还是全部,notifyall唤醒全部线程竞争资源,notify唤醒单个线程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值