线程

Thread t = new Thread();

t.start();----------创建新的线程

t.run();-----------没有创建新的线程,主线程调用Thread 中的run()方法

 

Thread.currentThread().getName() 线程名

 

Thread.currentThread()

getName()

Thread.sleep()睡眠多久+毫秒数

c.wait(time); wait 会让出资源,让出锁 wait-----一定要写在synchronized里 ,要有监视器才能调用, Object提供,动态方法

Thread.sleep(time) 不会让出锁 ,把资源占着 ,不工作 Thread 提供静态方法 可以直接调用

t.yield();-----让出当前线程的执行状态,Cpu分给我的时间片还没有用完,执行到这,让出剩余时间片,回到准备状态,

生命周期:新建---准备---运行---阻塞---死亡

1.新建:Thread t = new MyThread();

2.准备:t.start();-----cpu正在给其他线程工作,如main线程,只有到cpu分配到时间片才到运行状态,时间片用完回到准备状态,等cpu再次分配到时间片再次到运行状态

3.运行:

4.阻塞:synchronized --阻塞到准备状态,再到运行状态,阻塞形成死锁会直接进入死亡状态。

 

超时等待状态---sleep、wait、join long型的毫秒数做参数

等待状态----

 

javap -v -p MyThread.class

monitorenter 开启监视器-----getfield

monitorexit

synchronized ------是关键字,锁的是对象,不用手动释放,依靠字节码的监控器进入和退出实现同步过程(如果抛异常,会释放锁)

ReentrantLock------是java的一个类,锁的是自己,需要手动unlock()方法释放,底层通过AQS (抽象队列同步器)实现,没有监视器,不能用wait方法。(如果抛异常,不会自动释放锁)

 

 

 

concurrent并发包

 

ReentrantLock:可重入锁 ---多次锁要多次释放(锁几次就解几次)

ReentrantLock 实现代码的同步 当运行到lock.lock();,加为锁住状态,第二个线程到lock.lock()进入阻塞状态,lock.unlock();解锁,

靠代码的执行流程加锁,要手动释放,锁的是自己,没有监视器,不能用wait方法,ReentrantLock中代码抛异常,不会释放锁,所以lock.unlock(); 应该写在finally中,基于AQS (抽象队列同步器)实现

finally {

int i = lock.getHoldCount();

for (int j = 0; j < i; j++) {

lock.unlock();

}

}

 

lock.getHoldCount()---------加了几把锁

lock.getQueueLength();--------------当前还有多少人等着释放锁

 

 

 

 

排它锁-----------------共享锁,java实现可读写的读写锁

 

ReentrantReadWriteLock---类 implements ReadWriteLock

读锁:------共享锁------只会禁止写锁writeLock(),异步的

lock.readLock().lock();

lock.readLock().unlock();

 

写锁-------排它锁------禁止除了自己外的其他所有锁

lock.writeLock().lock();

lock.writeLock().unlock();

 

 

CAS过程--------保证并发最终结果一致性,比较并替换

好处:用户响应速度快,操作的其实是副本

劣势:资源的消耗,浪费一部分算例

共享锁--乐观锁:------认为拿走不会改它

排它锁--悲观锁---------认为拿走就会改它

出现AAB问题,用A换A,B以为A没换,用B去换A,导致出现问题,为了防止,出现版本号

 

ConcurrentHashMap<K, V> 为了保证安全效率,而且能并发,底层通过CAS和synchronized 实现的

 

 

1.快速失败(fail-fast)过程----通过modCount实现

HashMap的 modCount操作加值,删除,只要改里面的值,modCount会+1,查询不会

迭代遍历 非安全的容器时,抛ConcurrentModificationException异常

2.安全失败(fail-safe)--CAS过程中

 

 

 

ConcurrentHashMap----支持线程并发,是线程安全的

1.7用的分段锁,1.8用的CAS和synchronized 实现的

 

 

HashTable是安全的,但是仅方法加锁,外面不加synchronized ,也可能报ConcurrentModificationException异常

NullPointerException--------------------ConcurrentHashMap不能为空(key == null || value == null)会报异常

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值