关于多线程的若干问题点

进程和线程怎么理解,进程线程与JVM?

Java 并发编程之美-线程相关的基础知识
https://blog.csdn.net/Dome_/article/details/80028193(超级赞的文章)

wait notify、notifyall的通俗理解?

wait,notify,notifyAll 是定义在Object类的实例方法,用于控制线程状态。

三个方法都必须在synchronized 同步关键字所限定的作用域中调用,否则会报错java.lang.IllegalMonitorStateException ,意思是因为没有同步,所以线程对对象锁的状态是不确定的,不能调用这些方法。

因为涉及到对象锁,他们必须都放在synchronized中来使用.
wait和notify大概可以理解:当多个线程对公共资源同时访问时,人为有意的控制线程访问的顺序.以达到我们的目的.
那么,这时候,锁对象就是这个公共资源了.怎么表示一个线程获得了这个锁呢?像这样:synchronized(obj) {} 这样就获得了资源锁,wait和notify的调用都在{}中,这样,字面上就可以理解为执行同步块的线程可以决定是否调用wait或notify(要在同步块外调用,你当然决定不了当前哪个线程在调用)

wait: 表示持有锁对象(公共资源)的线程A释放掉锁对象(公共资源)的许可权,释放CPU资源并进入等待,让其他线程可以执行。
notify:表示持有锁对象(公共资源)的线程A准备释放掉锁对象(公共资源)的许可权,通知JVM唤醒某个竞争改物件锁的线程X,线程A synchronized程式码作用域结束后,线程X直接获得锁对象(公共资源)许可权,其他竞争者继续等待;
notifyall: 表示持有对象锁的线程A准备释放对象锁权限,通知jvm唤醒所有竞争该对象锁的线程,线程A synchronized 代码作用域结束后,jvm通过算法将对象锁权限指派给线程X,被唤醒的线程不再等待。线程X synchronized 代码作用域结束后,之前所有被唤醒的线程都有可能获得该对象锁权限,这个由JVM算法决定。
共享资源:所谓共享资源是说该资源被多个线程共享,多个线程都可以去访问或者修改的资源。另外本文当讲到的共享对象就是共享资源。

根据上述两点,在调用wait(), notify()或notifyAll()的时候,必须先获得锁,且状态变量须由该锁保护,否则会报错,详细介绍具体见下面的链接:
https://www.cnblogs.com/techyc/p/3272321.html

当一个线程调用一个共享对象的 wait() 方法时候,调用线程会被阻塞挂起,直到下面几个事情之一发生才返回:
1.其它线程调用了该共享对象的 notify() 或者 notifyAll() 方法;
2.其它线程调用了该线程的 interrupt() 方法设置了该线程的中断标志,该线程会抛出 InterruptedException 异常返回。

参考资料:

Java Object物件中的wait,notify,notifyAll通俗理解
https://www.aliyun.com/jiaocheng/819335.html(写的相当好)
Java 并发编程之美-线程相关的基础知识
https://blog.csdn.net/Dome_/article/details/80028193(超级赞的文章)

wait和sleep的区别?

1.首先,要记住这个差别,“sleep是Thread类的方法,wait是Object类中定义的方法”。尽管这两个方法都会影响线程的执行行为,但是本质上是有区别的。
2.Thread.sleep不会导致锁行为的改变,如果当前线程是拥有锁的,那么Thread.sleep不会让线程释放锁。但是wait睡眠时,释放对象锁;
3.Thread.sleep和Object.wait都会暂停当前的线程,对于CPU资源来说,不管是哪种方式暂停的线程,都表示它暂时不再需要CPU的执行时间。OS会将执行时间分配给其它线程。区别是,调用wait后,需要别的线程执行notify/notifyAll才能够重新获得CPU执行时间。
4.sleep可以指定时间

参考资料:
java sleep和wait的区别的疑惑?
https://www.zhihu.com/question/23328075(掌握上面4点区别就够了)

synchronized用法有哪些?

synchronized是Java中的关键字,synchronized可以保证方法或者代码块在运行时,同一时刻只有一个方法可以进入到临界区,同时它还可以保证共享变量的内存可见性,Java中每一个对象都可以作为锁,这是synchronized实现同步的基础。

它修饰的对象有以下几种:

  1. 指定加锁对象,对给定对象加锁,进入同步前需要获得给定对象的锁;
  2. 直接作用于实例方法,相当于对当前实例加锁,进入同步代码前要获得当前实例的锁;
  3. 直接作用于静态方法,相当于对当前类加锁,进入同步代码前要获得当前类的锁;(作用的对象是这个类的所有对象;)
  4. 修饰一个类,其作用的范围是synchronized后面括号括起来的部分,作用主的对象是这个类的所有对象。

Java多线程——synchronized使用详解
https://blog.csdn.net/zhangqiluGrubby/article/details/80500505(总结很全面)

当多个并发线程(thread1和thread2)访问同一个对象(这个很重要)(ThreadSyn)中的synchronized代码块时,在同一时刻只能有一个线程得到执行,其他线程受阻塞,必须等待当前线程执行完这个代码块以后才能执行该代码块。

volatile作用及原理?

1.volatile修饰的变量具有可见性
2.禁止指令重排

从双重校验单例完全理解Java指令重排
https://www.jianshu.com/p/16d2762a1d70

比较常见的就是双重检测的单例

代码实现生产者和消费者模式?

什么是生产者消费者模式
生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,生产者往存储空间中添加产品,消费者从存储空间中取走产品,当存储空间为空时,消费者阻塞,当存储空间满时,生产者阻塞。

实现方法1:wait、notify
生产者消费者之Java简单实现
https://segmentfault.com/a/1190000012173132

实现方法2:阻塞队列BlockingQueue的实现

实现方法3:信号量Semaphore的实现

实现方法4:更高并发性能的Lock && Condition

Java实现生产者和消费者的5种方式
https://juejin.im/entry/596343686fb9a06bbd6f888c

Java 实现生产者 – 消费者模型
http://www.importnew.com/27063.html

自己最好代码实现,并整理优化一下,至少最基本的要会写。

a,b,c三个线程,a线程输出a,b线程输出b,c线程输出c,这个也是可以理解的

join?
三个线程循环打印ABC10次的几种解决方法 原
https://my.oschina.net/wangmengjun/blog/778798

synchronized关键字的原理是什么,是怎么实现的?wait notify底层原理是什么,怎么修改它为等待?线程同步的内部原理,或者synchronized的原理

监视器锁???
http://www.importnew.com/29031.html

https://www.hollischuang.com/archives/2030

sleep的时间是怎么实现的,原理是什么?

Thread.State

Java线程状态分析
https://fangjian0423.github.io/2016/06/04/java-thread-state/

相关书籍&参考资料

有什么好的并发书籍推荐?
https://www.zhihu.com/question/27072408

Java特种兵(上册)里面有一部分并发的知识
https://read.douban.com/ebook/35729131/?dcs=subject-rec&dcm=douban&dct=24700553

实战Java高并发程序设计
http://item.jd.com/11800589.html

以下是一系列文章,可读
Java 并发编程之美:线程相关的基础知识
https://cloud.tencent.com/developer/article/1169712

Java 并发编程之美:并发编程基础晋级篇
https://blog.csdn.net/gitchat/article/details/79987379

Java 并发编程之美:并发编程高级篇之一
https://blog.csdn.net/GitChat/article/details/80479020

Java 并发编程之美:并发编程高级篇之二

Java 并发编程之美:并发编程高级篇之三
https://gitbook.cn/books/5ac8a7e72a04fd6c83713956/index.html

Java 并发编程之美:并发编程高级篇之四

Java 并发编程之美:并发编程高级篇之五

Java 并发编程之美:并发编程实践

关于为何以及如何阅读源码的一点心得

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值