java之并发基础

synchronized

保证多线程访问资源的同步性,它修饰的方法,代码块同时只能有一个线程执行

重量级:synchronized依赖于对象监视器来实现的,而监视器底层依赖于操作系统Mutex Lock(互斥锁)实现,java线程是映射到操作系统的线程上,线程的唤醒和挂起都是需要操作系统实现。系统实现线程切换需要从用户态转换到系统态是非常耗时的,效率低下。

优化:jdk6从jvm层对synchronized进行优化,引入偏向锁,轻量级锁来减少锁的开销。

使用:static方法和synchronized(A.class)上类锁,实例方法加类锁,不可修饰字符串(字符串有字符串常量池)

底层原理

synchronized修饰代码块时,monitorenter指向代码开始,monitorexit指向结束为止

当执行monitorenter时,对象锁的计数为0,表明未有线程持有锁,技术+1,执行monitorexit时技术-1

synchronized修饰方法时,用ACC_SYNCHRONIZED标明它是个同步方法

两者本质都是对对象监视器的获取

synchronized 和 ReentrantLock 的区别

共同点:可重入锁,可实现选择性通知(锁可以绑定多个条件),synchronized基于notify()/wait(),ReentrantLock基于condition接口的newCondition()。

异:synchronized依赖jvm,ReentrantLock依赖api,所得获取需要lock和unlock。

ReentrantLock可设置公平锁,超时时间,中断,多条件变量。

ReentrantLock公平锁与非公平锁区别

公平

获取锁先判断是否有线程持有锁,无锁并且队列为空则尝试获取锁,

有锁判断是否是当前线程以便可重入锁(重入失败则抛异常),无锁并且队列不为空则加入FIFO队列

非公平

获取锁直接CAS拿锁,失败则再次判断是否锁已被持有,未被持有则CAS获取

CAS获取失败则加入队列,有则判断当前线程以便可重入锁,不是当前线程则加入FIFO队列

volatile

原子性:保证变量一次或多次操作全部执行或全部不执行

可见性:一个线程修改,另外个线程立马就能知道,但不保证原子性

有序性:防止代码重排序

ThreadLocal->ThreadLocalMap

允许每个线程存储自己的变量,避免线程安全问题

ThreadLocalMap实际存储的位置为Thread的内部对象

ThreadLocalMap的本质是一个table[]+开方地址法,数组i为自己初始化的threadLocalHashCode&(table.length-1),table.length默认为16。ThreadLocal为key,2/3table扩容。

hash碰撞使用开放地址法解决(向后找一个空位槽位,直到不为空)

ThreadLocalMap的数组的Entry(Entry extends WeakReference<ThreadLocal<?>>),可见threadLocal为弱引用,而value为强引用

threadLocal在外部没有被强引用时,在垃圾回收时,key会被GC回收,而value不会,会导致key为null的大量Entry,产生内存泄漏。

在调用get(),set(),remove()时,会清楚key为null的Entry。回收时间取决于GC。

线程池

Runnable不支持返回和抛出异常

Callable可以抛出异常,返回值。Future包装返回结果

Executors方法:

execute() 无返回值

submit()返回Future对象,get()方法阻塞到返回,get可以设置超时时间

推荐ThreadPoolExecutor创建线程池

Executors不推荐(会导致OOM)

singleThreadPool和fixThreadPool允许请求队列Integer.MAX

cacheThreadPool和scheduleThreadPool允许创建线程数量Integer.MAX

ThreadPoolExecutor参数

corePoolSize:核心线程数

maxPoolSize:最大线程线程数

workQueue:队列

核心线程数用完之后会加入队列,队列满了之后创建maxPoolSize线程数执行

keepAliveTime:超出核心线程数的线程空闲时间,超过空闲时间销毁(前提是没新任务提交)

unit:空闲时间单位

threadFactory:创建线程的工厂

handler:饱和策略(队列满,线程数量达到maxPoolSize)

         AbortPolicy:拒绝任务,抛出异常

                   CallerRunsPolicy:execute调用线程执行,如果执行程序关闭则丢弃任务

                   DiscardPolicy:直接丢弃次任务

         DiscardOldestPolicy:丢弃最早提交没执行的任务

Atomic

1.基本数据类型

    AtomicInteger,AtomicLong,AtomicBoolean    

2.数组类型

   AtomicIntegerArray,AtomicLongArray,AtomicRefrenceArray   

3.引用类型

    AtomicRefrence,AtomicStampedReference(原子更新,带有数值版本号,可用于解决CAS的ABA问题),AtomicMarkableReference

4.对象属性类型

    AtomicIntegerFieldUpdater

  AtomicLongFieldUpdater

  AtomicReferenceFieldUpdater

AQS

一个构建锁和同步的框架,实际上是一个虚拟的双向队列,先进先出,基于他的实现有ReentRantLock,Semaphore,ReentrantReadWriteLock,SynchronousQueue,FutureTask

独占锁:ReentRantLock

共享锁:countDownLatchSemaphore、 CyclicBarrierReadWriteLock

AQS使用模版模式,自定义同步器需要实现钩子方法(抽象方法,可以是空方法,可以子类实现)AQS通过钩子方法实现固定步骤

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值