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)会报异常