天天看点

java线程小知识

1,锁

     synchronized,wait,notify,nofifyAll其实都是对锁的操作。synchronized一个对象,一个代码区,一个方法,其实都是获取该对象的锁,一个对象只有为一个的一个锁,代码区,和方法锁,其实获取的是该对象的锁。如

   public synchronized void test()

  {

  }

  执行该方法之前申请该对象的锁。

 2,Thread和Runable 

  thread 和 Runnable 的相同点:都是“多线程的实现方式”。

  Thread 和 Runnable 的不同点:

  Thread 是类,而Runnable是接口;Thread本身是实现了Runnable接口的类。我们知道“一个类只能有一个父类,但是却能实现多个接口”,因此Runnable具有更好的扩展性。

3,synchronized基本规则

  第一条: 当一个线程访问“某对象”的“synchronized方法”或者“synchronized代码块”时,其他线程对“该对象”的该“synchronized方法”或者“synchronized代码块”的访问将被阻塞。

  第二条: 当一个线程访问“某对象”的“synchronized方法”或者“synchronized代码块”时,其他线程仍然可以访问“该对象”的非同步代码块。

  第三条: 当一个线程访问“某对象”的“synchronized方法”或者“synchronized代码块”时,其他线程对“该对象”的其他的“synchronized方法”或者“synchronized代码块”的访问将被阻塞。

4,notify,notifyAll

  使用notify或notifyAll后,只是唤醒了其它该锁的wait线程,使他们拥有获取锁的权利,此时他们还是阻塞的,必须等待获取锁才能回到运行状态,wait是由持有锁的对象调用,如果该对象不持有锁,调用则会报错

5,interrupt

  该调用该操作时,首先会检查权限,没有会抛异常,如果有,做的操作是将线程的中断标记设置为True,并不会中断线程。如果该线程处于阻塞状态,则会抛出异常

  记住该操作知识做标记,并不会中断线程

  

下面是jdk描述

  本线程中断自己是被允许的;其它线程调用本线程的interrupt()方法时,会通过checkAccess()检查权限。这有可能抛出SecurityException异常。如果本线程是处于阻塞状态:调用线程的wait(), wait(long)或

wait(long, int)会让它进入等待(阻塞)状态,或者调用线程的join(), join(long), join(long, int), sleep(long), sleep(long, int)也会让它进入阻塞状态。若线程在阻塞状态时,调用了它的interrupt()方法,那么它

的“中断状态”会被清除并且会收到一个InterruptedException异常。例如,线程通过wait()进入阻塞状态,此时通过interrupt()中断该线程调用interrupt()会立即将线程的中断标记设为“true”,但是由于线程处于阻

塞状态,所以该“中断标记”会立即被清除为“false”,同时,会产生一个InterruptedException的异常如果线程被阻塞在一个Selector选择器中,那么通过interrupt()中断它时;线程的中断标记会被设置为true,并且

它会立即从选择操作中返回。如果不属于前面所说的情况,那么通过interrupt()中断线程时,它的中断标记会被设置为“true”。中断一个“已终止的线程”不会产生任何操作。

6,java.lang.IllegalMonitorStateException分析

   1,当前线程不含有当前对象的锁资源的时候,调用obj.wait()方法;

        2,当前线程不含有当前对象的锁资源的时候,调用obj.notify()方法。

        3,当前线程不含有当前对象的锁资源的时候,调用obj.notifyAll()方法

 7,wait,notify与condition的await,signal

   notify与notifyAll唤醒不能指定线程,不能很好控制各个线程的等待与唤醒。而condition的await,signal操作可以对不同的需求对该锁建立不同的condition,从而对各个线程精确控制。

8,wait,notify与LockSupport的park,unpark

  wait,notify的使用者必须是获取sychronized同步锁的对象,没获取就不能使用,而LockSupport可以对其它线程进行锁定和唤醒。

9,FairSyn,NoFairSyn

  主要不同在于获取锁的时候,当锁状态为0时,NoFairSyn是抢占式的,而FairSyn则需要判断等带队列是否为空

转载于:https://www.cnblogs.com/2015zzh/p/4972966.html