java多线程与锁相关

线程五种状态:

新建状态:首次创建线程,new Thread() 不具备其他任何状态

就绪状态:执行start()进入就绪状态,线程已经启动,分配了cpu时间片,排队等待运行

执行状态:获得cup资源 执行run(),没有意外直接执行到结束

终止状态:当执行结束或调用stop() destory(),或被其他线程杀死,不能再进入就绪状态

阻塞状态:由于某种原因,在执行状态中暂停执行,让出cpu

sleep()进入睡眠 规定时间后自动苏醒回到就绪状态

Wait()进入等待 需要notify(),notifyAll()回到就绪状态

当被其他线程所阻塞,调用suspend()

中断:

java中断机制是一种协作机制通过一个线程去中断另一个线程(对该线程发出中断请求,该线程根据合适机会自己处理)

线程方法:

//线程让步

//使线程进入暂停,让出cpu资源,直接进入就绪状态,而不是阻塞状态

Thread.yield()

//t.join()方法只会使主线程进入等待池并等待t线程执行完毕后才会被唤醒。并不影响同一时刻处在运行状态的其他线程。

//比如t1.join(),必须等t1全部执行完,才能继续执行未就绪的线程,与他同时执行的不影响    

 public join()

//线程设置优先级  MAX_PRIORITY =10  MIN_PRIORITY =1  NORM_PRIORITY =5

t1.setPriority();

Sychronized

对代码块加锁:锁住的是任意对象,默认是this,(也就是说当新创建了第二个对象来访问不受限制)

对普通方法加锁:锁住的是同一个对象,默认是this

对静态方法加锁:锁住的是当前类的class对象,除了被锁住的静态方法受到限制,该类其余方法不受限制。

Lock接口

创建lock   Lock lock=new ReentrantLock();

lock.lock();  

解锁 lock.unlock();

locksynchronized区别:

1.synchronized是锁住方法体,代码块比较大的部分。Lock可以局部上锁解锁

2.synchronizedjava的关键字,有jvm处理锁与解锁,不需要用户主动释放锁。LockJava类通过代码实现锁,需要主动释放,不释放容易出现死锁。

3.synchronized不可中断。Lock可以中断。

4synchronized是一种悲观锁。Lock是一种乐观锁

5.synchronized是不公平锁。Lock默认非公平,根据传入的参数true为公平

公平锁与非公平锁

JavaFIFO的是公平锁。根据队列先后顺序,先申请的线程先获得锁

非公平锁,可能出现插队情况

可重入锁与不可重入锁

以线程为单位,当一个线程获得对象锁之后,可再次获得该对象上的锁

防止死锁

可重入锁与不可重入锁对比,简单来说就是:可重入锁会多两个属性(1、获得该锁的线程;2、获得该锁的次数),根据第一个属性判断,如果是持有该锁的那个线程又来lock,不会被阻塞(wait),而是在上锁的次数加一(表示这个线程又锁了一次(重入)),只有该线程unlock的次数达到上锁的次数(即第二个属性等于0),才会唤醒其他线程。

线程池

一个装满Thread的容器,可重复使用线程。避免了频繁的创建新线程

ExecutorService es = Executors.newFixedThreadPool(10); //创建线程数为10的线程池

原文地址:https://www.cnblogs.com/ttaall/p/11962874.html