Java并发笔记

常用命令
jps:列出所有正在运行的java进程,其中jps命令也是一个java程序,前面的数字就是对应的进程id。
jstack PID 查看某个进程的所有线程状态
jconsole 查看某java进程中线程运行状态cmd中

Linux中
ps [options] [–help]
ps -ef 当前所有的进程。
A 列出所有的进程
-w 显示加宽可以显示较多的资讯
-au 显示较详细的资讯
-aux 显示所有包含其他使用者的进程

在这里插入图片描述

start()重复调用会报错IllegalThreadStateException

判断是否线程被打断了

Thread.currentThread().isInterrupted()

守护线程

只要其他非守护线程都结束了,守护线程就算没执行完都会强制结束

setDaemon(True)

竞态条件

一段代码块中如果存在对共享资源的多线程读写操作,该代码块为临界区
多个线程在临界区内执行,由于代码的执行顺序不同而导致结果无法预测,则发生了竞态条件

Synchronizated

不公平锁

synchronizated(对象){
		临界区
}
ReemtramtLock
reentrantLock.lock();
try{
//临界区
}finally{
//释放锁
reentrantLock.unlock();
}

1.可重入性

reentrantLock.lock();
try{
//临界区再次重复加锁
	
}finally{
//释放锁
reentrantLock.unlock();
}

2.可打断避免死锁

reentrantLock.lockInterruptibly();

如果有竞争则不执行,被打断了可以执行
3.锁超时
获取不到锁就不等待

reentrantLock.tryLock(timeout)

4.公平锁
先进入线程先使用锁

同步控制

await signal
await前需要获得锁
await执行释放锁,进入conditionObject等待
await被唤醒后重新竞争lock锁

wait notify

        Thread t1=new Thread(()->{
            synchronized (lock){
                while (!f){
                    try {
                        lock.wait();
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                }
                log.debug("t1");
            }
        });

        Thread t2=new Thread(()->{
            synchronized (lock){
                f=true;
                lock.notify();
                log.debug("t2");
            }
        });

LockSupport.park()//将当前线程停下来
LockSupport.unpark(thread)//唤醒thread线程

JMM——Java内存模型

1.可见性
volatile 易变关键字
修饰变量,避免线程从自己的工作缓存中寻找变量的值,必须到主存中获取
多线程中,一个线程保证volatile变量修改对另一个线程可见,却不保证原子性
2.原子性

线程池 ThreadPoolExecutor
public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit unit,
                          BlockingQueue<Runnable> workQueue) {
    this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
         Executors.defaultThreadFactory(), defaultHandler);
}

addWorker 这个方法主要用来创建新的工作线程
execute()方法用于提交不需要返回值的任务,所以无法判断任务是否被线程池执行成功与否
submit()方法用于提交需要返回值的任务。
shutdown() :关闭线程池,线程池的状态变为 SHUTDOWN。线程池不再接受新任务了,但是队列里的任务得执行完毕。

FixedThreadPool 被称为可重用固定线程数的线程池。
SingleThreadExecutor 是只有一个线程的线程池。
CachedThreadPool 是一个会根据需要创建新线程的线程池。

CAS

compare and swap比较和交换
替换内存中某个位置的值时,先查看内存中的值是否与预期一致

compareAndSet() 原子操作
使用AtomicInteger等类型

JUC

AQS

AbstractQueuedSynchronized 是阻塞式锁和相关的同步器工具的框架
state表示资源状态-独占模式和共享模式

reentrantLock
读写锁

线程安全集合类

Hashtable,Vector 使用synchronized修饰方法
SynchonizedMap,SynchonizedList
JUC安全合集,Blocking类,Concurrent类,CopyOnWrite类

ConcurrentHashmap
ConcurrentLinkedQueue
BlockingQueue
CopyOnWriteArrayList
  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

想成为全栈工程师的小小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值