Fork me on GitHub

多线程与并发

注意:所有文章除特别说明外,转载请注明出处.

[TOC]

多线程与并发 - 面试

如何实现处理线程的返回值

1.主线程等待法

2.Thread类的join()阻塞当前线程以等待子线程处理完毕

3.通过Callable接口实现,通过 FutureTask 或 线程池获取

sleep()方法与wait()方法区别

1.sleep()是Threadk类的方法,wait()是Object类中定义的方法

2.sleep()方法可以在任意地方使用

3.wait()方法只能在synchronized方法或synchronized块中使用

最主要本地区别:

    1.Thread.sleep()只会让出CPU,不会导致锁行为的改变

    2.Object.wait()不仅让出CPU,还会释放已经占有的同步资源锁

synchronized

1.互斥性

2.可见性

注意:synchronized锁的不是代码,锁的都是对象

分类:

    1.获取对象锁

        1.同步代码块

        2.同步非静态方法

    2.获取类锁

        1.同步代码块

        2.同步静态方法

    总结:对象锁和类锁

        1.有线程访问对象的同步代码块时,另外的线程可以访问该对象的非同步代码块

        2.若锁住的是同一个对象,一个线程在访问对象的同步代码块时,另一个访问对象的同步代码块会被阻塞

        3....

J.U.C知识点

java.util.concurrent,提供并发编程的解决方案。

1.CAS是java.util.concurrent.atomic包的基础

2.AQS是java.util.concurrent.locks包以及一些常用类如:Semophore ReentrantLock等类的基础
J.U.C包的分类
1.线程执行器executor

2.锁locks

3.原子变量类atomic

4.并发工具类tools

    1.闭锁 CountDownLatch

        内部有一个计数器(cnt),每调用一次则减1,直到为0之后回到主线程继续

        让主线程等待一组事件发生后继续执行,而这里的事件是指CountDownLatch里的countDown()方法

    2.栅栏 CyclicBarrier

        内部有一个计数器(cnt),每调用一次则减1,直到为0之后回到主线程继续

        阻塞当前线程,等待其它线程,所有线程必须同时到达栅栏位置后,才能继续执行

        所有线程到达栅栏处,可以触发执行另外一个预先设置的线程


    3.信号量Semaphore

        控制某个资源可以同时被访问的线程个数

    4.交换器 Exchanger

        两个线程到达同步点后,相互交换数据

        注意:Exchanger只能作用于两个线程

5.并发集合collections

    BlockingQueue 提供可阻塞的入队和出队操作,主要用于生产者和消费者模式,在多线程场景下生产者线程在队尾添加元素,而消费者在队列头部消费元素,通过此种方式能够达到将任务的生产和消费进行隔离。

    线程安全:

        1.ArrayBlockingQueue 一个由数组结构组成的有界阻塞队列

        2.LinkedBlockingQueue 一个由链表结构组成的有界/无界阻塞队列

        3.PriorityBlockingQueue 一个支持优先级排序的无界阻塞队列

        ...

Java的IO机制

问题1:Java BIO NIO AIO的区别

BIO (Block IO) 表示传统的IO:传统的InputStream OutputStream Reader Writer,该模式是基于流模式实现的

NonBlock-IO(NIO) 构建多路复用的、同步非阻塞的IO操作

本文标题:多线程与并发

文章作者:Bangjin-Hu

发布时间:2019年10月15日 - 09:22:26

最后更新:2020年03月29日 - 09:51:04

原始链接:http://bangjinhu.github.io/undefined/多线程与并发 - 面试/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

Bangjin-Hu wechat
欢迎扫码关注微信公众号,订阅我的微信公众号.
坚持原创技术分享,您的支持是我创作的动力.