
线程和进程的区别?


并行和并发的区别?



创建线程的方式有哪些?

1:

2:

3:实现Callable接口并用future task来获取执行结果

这需要定义一个泛型,call里面的代码就是我们自定义要执行的代码
4:

这个MyExecutors要去是实现runnable或者callable接口
线程包括哪些状态?



t2运行必须等待t1结束,t3运行必须等待t2结束








CAS 是一个单一的原子操作:它就像一把 “精密的螺丝刀”,功能很单一 —— 只能完成 “比较内存中的值是否等于预期值,如果是就换成新值” 这一个动作,而且这个动作是原子的(不会被打断)。

volatile

当执行的时候最后一个线程不会结束,因为jvm有个jit编译器,他会自动把条件编译为
while(true),也就是把!stop编译为true这样你去改变stop的值线程3并不会做出任何改变
解法:
一:加vm参数关闭及时编译器(得不偿失)

二:用volatile去修饰共享变量(告诉及时编译器不要对这个变量进行优化)
AQS:

AQS维护了一个消息队列,先进先出的队列,同时维护了一个state变量,放一个线程来到之后持有锁会将state更改为0—>1,这样当第二个线程来了之后会进入队列进行排队等待,直到state变为0之后等待的线程才会继续执行,同时把0改为1依次类推

如果一开始就有多个线程去争抢更改state怎么办?
aqs底层用的是cas,比较并交换,AQS 是一个完整的 “工作台”:它不仅用到了 CAS 这把 “螺丝刀”,还包含了其他 “零件”:
一个 state 变量(记录锁的状态,比如是否被占用、重入次数等);
一个双向链表(管理等待锁的线程队列);
一套线程阻塞 / 唤醒的逻辑(通过 LockSupport 实现)。
AQS 用 CAS 来做什么?

aqs既可以是公平锁也可以是非公平锁,因为

如果队列中的线程和新进来的线程争抢state,那么就是非公平锁,如果没有新的线程,那么机会按队列中的线程进行执行,此时他是公平锁,
ReentrantLock:



ConcurrentHashMap:
这个是一个线程安全的集合,

1.7版本:前面的数组是不可那变数组,后面是可变数组,当数据过来之后先计算其hash值然后进去第一组数组中对应的位置,然后根据reentrantlock去锁住这个线程一个一个进入里面那一层的数组,里面这个数组存的就是数据了
1.8以及以后版本:

回答:

线程池的核心参数:

