《Java多线程编程核心技术》——多线程与同步

Java多线程

线程能够理解为是在进程中独立运行的子任务。html

Java多线程

使用方法

Java中实现多线程主要有如下两种方法:java

  • 继承Thread,然后实例化该对象调用start()即启动了新线程;
  • 实现Runnable,经过new Thread(Runnable run)实例化该线程,然后调用start();

经常使用方法

  • Thread.currentThread() 静态方法,获取当前线程对象;
  • isAlive() 判断线程是否处于活动状态,即线程已启动且还没有终止;
  • Thread.sleep(long ) 在指定的毫秒数内让当前线程休眠,须要catch InterruptedException
  • Thread.interrupted() 判断该线程是否中断,执行后将清除中断标志;
  • isInterrupted() 测试线程是否已经中断;
  • suspend() resume() stop() 暂停、开始和结束线程,不该该使用。暂停方法不会释放资源;
  • yield() 该线程放弃当前CPU资源,放弃后立刻进行CPU竞争;
  • setPriority() 设置线程优先级,1~10,越大优先级越高;
    • 优先级具备继承性,即子线程有父线程的优先级;
    • 高优先级的线程老是大部分先执行完,但不表明高优先级将所有先完成;
    • 优先级较高的不必定每一次都先执行完,具备随机性;
    • 具体的与OS相关;
  • setDaemon() 设置守护线程,当进程不存在非守护线程时则守护线程将销魂然后进程销毁;

中止线程

中止线程有一下方法:安全

  1. 使用退出标志,在线程中检查标志判断是否退出。
  2. 使用stop方法强制终止线程,该方法可能致使线程不安全,不要使用。
  3. 使用interrupt方法中断线程,其原理就是第1条,只是Thread对其进行了封装。
  • 使用interrupt中断结合异常退出线程,在线程中当读到中断标志已经设置,可在此时抛出InterruptedException使线程退出。
  • 在sleep状态下若是该线程被中断,则将进入catch InterruptedException同时将清除中断标志。
  • 使用interrupte与return实现中止线程,可是仍然建议使用异常退出,这样能够保留中断异常使线程中止异常获得传播。

同步

非线程安全:存在多个线程对同一个对象中的实例变量进行并发访问控制由此致使的数据脏读;markdown

  • 方法内的局部变量和实例内的私有变量(不存在get/set)均不能被外部访问,所以是线程安全的;

synchronized

  • synchronized取得的是对象锁而非方法或代码块的锁;
  • synchronized声明的方法必定是排队运行的,并且只有共享资源的读写才须要使用其进行同步;
  • synchronized声明的非静态方法其获取的锁是该实例对象的锁;
  • synchronized声明的静态方法获取的锁是该类对象(永久代中类对象)的锁;
  • synchronized声明的代码块获取的锁则是括号里声明的对象的锁;
  • synchronized未声明的方法对其调用时不须要考虑锁的问题,所以不会有synchronized方法或代码块冲突;
  • synchronized支持锁重入(同一线程屡次获取同一个锁);
  • 同步方法或代码块中出现异常则其所持锁将自动释放;
  • 方法的同步不具备继承性;
  • 同步方法或代码块是否冲突只看二者锁持有的锁是不是同一个;
  • synchronized声明的非静态方法与synchronized(this)的代码块使用的锁都是对象自己;
  • 因为String的常量池可能使相同字符串指向同一个对象,所以不要使用String做为synchronized代码块的对象监视器;
  • synchronized方法或代码块内的变量也有可见性;

volatile

  • volatile是使变量拥有可见性;
  • volatile修饰的变量在使用时并不是从工做内存获取而是都从主内存中获取;
  • volatile修饰的变量在修改时其修改结果将直接写入到主内存;
  • 多线程访问volatile变量不会阻塞,可是不保证变量的原子性;

---恢复内容结束---多线程

转载于:https://www.cnblogs.com/suolu/p/6670763.html并发