java并发编程篇

一、Java如何开启线程?怎么保证线程安全?
线程和进程的区别:进程是操作系统进行资源分配的最小单元。线程是操作系统进行任务分配的最小单元,线程隶属于进程。
如何开启线程:1.继承Thread类,重写run方法。2.实现Runnable接口,实现run方法,3.实现Callable接口,实现call方法。通过FutureTask创建一个线程,获取到线程执行的返回值,4.通过线程池来开启线程。

二、Volatile和Synchronized有什么区别?Volatile能不能保证线程安全?DCL(Double Check Lock)单例为什么要加Volatile?
1.Synchronized关键字是用来加锁。Volatile只是保证变量的线程可见性,通常用于一个线程写,多个线程读的场景。
2.不能,Volatile只能保证线程可见性,不能保证原子性。
3.Volatile防止指令重排。在DCL中,防止高并发的情况下,指令重排造成的线程安全问题。
三、Java线程锁机制是怎样的?偏向锁、轻量级锁、重量级锁有什么区别?锁机制是如何升级的?
1.Java的锁就是在对象的Markword中记录一个锁状态,无锁、偏向锁、轻量级锁、重量级锁对应不同的状态。
2.Java的锁机制就是根据资源竞争的激烈程度不断进行锁升级的过程
3.

四、谈谈你对AQS的理解?AQS如何实现可重入锁?
1.AQS是一个Java线程同步框架,是JDK中很多锁工具的核心实现框架。
2.在AQS中,维护了一个信号量state和一个线程组成的双向链表队列。其中,这个线程队列,就是给线程用来排队的,而state就像是一个信号灯,用来控制线程排队或者放行的。在不同的场景下,有不同的意义。
3.在可重入锁这个场景下,state就用来表示加锁的次数,0标识无锁,每加一次锁state就加1,释放锁state就减1.
五、有A、B、C三个线程,如何保证三个线程同时执行?如何保证三个线程依次执行?如何保证三个线程有序交错执行?
CountDownLatch CylicBarrier Semaphore

六、如何对一个字符串快速进行排序?
分而治之 Fork/Join框架

七、并发的三大特性
1.原子性:原子性是指在一个操作中CPU不可以在中途暂停然后在调度,即不被中断操作,要不全部执行完,要不都不执行。 就好比转账
使用Synchronized关键字
2.可见性:程序执行的顺序和代码的顺序保持一致。
Volatitle关键字保证可见性+ CAS final关键字保证可见性
3.有序性:一个线程对变量的修改,另一个线程能立马看到。
Volatitle 可以防止指令重排保证有序性。

八、对线程安全的理解
不是线程安全,应该是内存安全,堆是共享内存,可以被所有线程访问。
堆是进程和线程共有的空间,分全局堆和局部堆。全局堆就是所有没有分配的空间,局部堆就是用户分配的空间,堆在操作系统对进程初始化的时候分配,运行过程也可以向系统要额外的堆,但是用完了要还给操作系统。要不然就是内存泄露。
(在Java中,堆是Java虚拟机所管理的内存中最大的一块,是所有线程共享的一块内存区域,在虚拟机启动的时候创建。堆所存在的内存区域的唯一目的就是存放对象实例,几乎所有的对象实例以及数组,都在这里分配内存。)

栈是每个线程独有的,保存其运行状态和局部自动变量的,栈在线程开始的时候初始化,每个线程的栈互相独立,因此,栈是线程安全的,操作系统在切换线程的时候会自动切换栈。栈空间不需要在高级语言里显示的分配和释放。

目前主流的操作系统都是多任务的,即多个任务同时进行。为了保证安全,每个线程只能访问分配给自己的内存空间,而不能访问别的进程的,这是由操作系统保证的。

在每个进程的内存空间中都会有一块特殊的公共区域,通常称为堆内存。进程内的所有线程都可以访问到该区域,这就是造成问题的潜在愿意。

九、Java死锁如何避免
造成死锁的原因:
1.一个资源每次只能被一个线程使用
2.一个线程在阻塞等待某个资源时,不释放已占有资源
3.一个线程已获得资源,在未使用之前,不能被强行剥夺
4.若干线程形成头尾相接的循环等待资源关系

这是造成死锁必须要达到的4个条件,如果要避免死锁,只需要不满足其中一个条件即可。而其中的前三个条件是作为锁要符合的条件,所以要避免死锁就需要打破第4个条件,不出现循环等待锁的关系。

在开发过程中:
1.要注意加锁顺序,保证每个线程按同样的顺序加锁。
2.要注意加锁时限,可以针对锁设置一个超时时间。
3.要注意死锁检查,这是一种预防机制,确保在第一时间发现死锁并进行解决

十、如果提交任务时,线程池队列已满,这时会发生什么?
1.如果是使用的无界队列,那么可以继续提交任务
2.如果是使用的有界队列,如果队列已满,如果核心线程书没有达到上线,那么则增加线程,如果线程数达到最大值,则使用拒绝策略进行拒绝。

十一、synchronized和ReentrantLock的区别?
1.Synchronized是一个关键字ReentrantLock是一个类
2.Synchronized会自动的加锁和释放锁ReentrantLock需要程序员手动加锁和释放锁
3.Synchronized的底层是jvm层面的锁,ReentrantLock是Java API层面的锁
4.Synchronized是非公平锁,ReentrantLock可以选择公平锁或非公平锁
5.Synchronized锁的是对象,所信息是保存在对象头中,ReentrantLock通过代码中int类型的state标识来标识锁的状态。
6.Synchronized底层有一个锁升级的过程。

十二、线程池的原理,FixedThreadPool用的阻塞队列是什么?
线程池内部是通过队列+线程实现的。

FixedThreadPool代表定长线程池,底层是用LikedBlockingQueue,表示无界的阻塞队列。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值