并发

1.Java线程有优先级 :1~10

static int MAX_PRIORITY:线程可以具有的最高优先级,取值为10。

static int MIN_PRIORITY:线程可以具有的最低优先级,取值为1。

static int NORM_PRIORITY:分配给线程的默认优先级,取值为5。

使用: 主线程优先级为normal;优先级有继承关系,A线程中创建B线程,那么A,B同样优先级

Thread4 t1 new Thread4("t1");

t1.setPriority(Thread.MAX_PRIORITY);//这里设置具体数值也是可以的      getPriority可以获取线程优先级

1.1线程睡眠         不释放锁

sleep():使线程转为阻塞状态,当sleep结束后,转为就绪       

1.2线程等待object中的方法         释放锁

wait():当前线程等待,释放锁,直到其他线程调用此对象的notify()方法或notifyAll()唤醒方法,行为等价于wait(0)

1.3线程让步        不释放锁

yield():暂停当前正在执行的对象,把执行机会让给相同或者更高优先级的线程

1.4线程加入

join() :当前线程调用另一个线程的jion()方法,当前线程进入阻塞状态,直到另一个进程运行结束,当前才阻塞—>就绪

1.5线程唤醒    

notify()与notifyAll()   一个是唤醒一个等待的线程,一个是全部线程唤醒。

https://blog.csdn.net/eff666/article/details/53559201

2.join()  :等待该线程终止

主线程启动子线程,子线程用了join方法,则join()方法后的代码需等子线程执行完才会结束回主线程执行

不加join,主线程开始-->主线程结束-->子线程开始-->子线程结束

加join,主线程先开始-->子线程开始-->子线程结束→主线程结束

3.yield() 停止当前正在执行的线程对象,让步相同优先级其他线程,从运行状态→可运行状态(可能没有效果)

4.sleep()当前线程进入停滞,这段时间未释放锁,yield()让给同优先级其他线程执行,yield()被称为“退让”

sleep()之后,低优先级线程可获取运行机会,yield()只让同优先级

5.interrupt()中断某个线程,一般设boolean变量来控制run方法什么时候结束,然后让线程调用interrupt()

isAlive():判断一个线程是否存活

activeCount():程序中活跃的线程数

currentThread():得到当前线程

isDaemon():一个线程是否为守护线程    守护线程必须在线程启动前调用setDaemon(true)方法       守护线程就是后台通用服务线程

线程是有继承性的,守护线程创建的线程也是守护线程(后台线程)      setDeamon会出现不执行finally的情况

synchronized用法:

  1. 当做方法修饰符   :同步方法,锁定的为调用这个同步方法的对象
  2. synchronized(this):与第一个相同,this代表调用这个方法的对象
  3. 同步块:
  4. synchronized作用于static:当前调用这个方法的对象所属的类获得锁

线程传递方式:

  1. 线程的运行和结束是不可确定的,因此,传递和返回数据无法像方法 一样通过方法参数和return语句返回数据
  2. 通过构造方法传递数据
  3. 通过setName()和变量等来传递数据
  4. 通过方法回调传递数据

继承Thread            实现多线程

实现Runnable接口 实现多线程

ReenTrantLock:允许尝试获取锁但最终未获取锁,这样如果其他线程获取了锁,自己就去做别的事,而不是仅仅是等待

原子性可替换同步

volatile:确保了应用的可视性,如果将一个域声明为volatile,那么只要对这个域产生了写操作,那么所有的读操作都可以看到这个修改(volatile域会被立即写入到主存中,而读操作就发生在主存中

多个任务在同时访问某个域,那么这个域就应该是volatile,否则这个域就应该只能经由同步来访问。同步也会导致向主存中刷新,因此,若一个域完全由synchronized方法或语句块来防护,则不必将其设置为volatile

原子性:

通过使用AtomicInteger消除synchronized关键字

临界区:::synchronized(syncObject){}  :防止多个线程同时访问方法内部的部分代码而不是访问整个方法     syncObject为获得该锁的对象,只有获得锁了才能进入同步控制块

使用缓存锁定的方式实现原子性,

java通过锁和循环CAS的方式来实现原子操作

原子操作常用方法

  1. int addAndGet(int delta): 以原子方式将输入的数值与实例中的值(AtomicInteger里的value)相加,并返回结果
  2. boolean compareAndSet(int expect,int update):如果输入的值等于预期值,则以原子方式将该值设置为输入的值
  3. int getAndIncrement():以原子方式将当前值加一(返回的值为自增前的值)
  4. void lazySet(int newValue):最终会设置为newValue,使用lazySet()后,可能导致其他线程在之后的一小段时间内还是可以读到旧的值
  5. int getAndSet(int newValue):以原子方式设置为newValue的值,并返回旧值

原子更新数组:

  1. int addAndGet(int i,int delta):以原子方式将输入值与数组中索引i的元素相加
  2. boolean compareAndSet:如果当前值等于预期值,则以原子方式将数组位置 i 的元素设置成update值

数组value通过构造方法传递进去,然后AtomicIntegerArray会将当前数组复制一份,所以当AtomicIntegerArray对内部的数组元素进行修改时,不会影响传入的数组

ReentrantLock类

和synchronized关键字一样,线程间执行的顺序是随机的,一旦持有锁,则需释放锁,其他的线程才能获得

Lock

  1. int getHoldCount()   作用为查询当前线程保持此锁定的个数,也就是调用lock方法的次数
  2. int getQueueLength()  返回正等待获取此锁定的线程估个数
  3. int getWaitQueueLength(Condition condition)  返回等待与此锁相关的给定条件Condition的线程估计数,如5个线程,每个线程都执行了同一个condition对象的await()方法,则调用getWaitQueueLength()方法时返回的int值为5
  4. boolean hasQueuedThreads(Thread thread) 查询是否有线程正在等待获取此锁定
  5. boolean hasWaiters(Candition condition)  查询是否有线程正在等待与此锁有关的condition条件
原文地址:https://www.cnblogs.com/acg88688/p/11870600.html