1:blocked线程和waiting的线程的区别? 如何唤醒?

  java线程中含有waiting与blocked两种状态:

   线程的 blocked状态往往是无法进入同步方法/代码块来完成的(BLOCKED是指线程正在等待获取锁)。这是因为无法获取到与同步方法/代码块相关联的锁。

  WAITING是指线程正在等待其他线程发来的通知(notify),收到通知后,可能会顺序向后执行(RUNNABLE),也可能会再次获取锁,进而被阻塞住(BLOCKED)。(有几种情况导致WAITING状态呢?: 自己call  join(),  wait(), 或等待其他线程call  notify(), notifyall())

  notify是将某个waiting的线程状态改变为blocked(由于notify的线程尚未退出临界区,尚未释放锁,所以被唤醒的线程状态变为blocked),notifyAll是将所有线程的状态改变为blocked。

JAVA为提供了wait()和notifyAll以及notify()实现挂起线程,并且唤醒另外一个等待的线程。(这些方法只能在一个同步语句或者同步方法内调用,原因是因为如果一个方法不要求互斥,那么就没有必要在线程间监听或者是合作,每个线程都可以自由访问这个方法。)

  在JAVA虚拟机中,每个对象(Object和class)通过某种逻辑关联监视器,为了实现监视器的互斥功能,每个对象(Object和class)都关联着一个锁(有时也叫“互斥量”),这个锁在操作系统书籍中称为“信号量”,互斥(“mutex “)是一个二进制的信号量。

  我们知道JAVA每个对象(Object/class) 都关联一个监视器,更好的说法应该是每个对象(Object/class)都有一个监视器,对象可以有它自己的临界区,并且能够监视线程序列为了使线程协作,JAVA为提供了wait()和notifyAll以及notify()实现挂起线程,并且唤醒另外一个等待的线程。

  在java虚拟机中,每个对象和类在逻辑上都和一个监听器相关联。为了实现监听器的共同执行能力,锁(有时候又叫互斥量)关联着每个对象和类,在操作系统书上被称之为“信号量”,互斥量其实就是一个二态的信号量。

3: 原子类和synchronized 哪个快?

      就算没有竞争,synchronized也比原子操作慢。

  Synchronized锁是独占的,意味着如果有别的线程在执行,当前线程只能是等待!

  比较并交换(compare and swap, CAS),是原子操作的一种,可用于在多线程编程中实现不被打断的数据交换操作,从而避免多线程同时改写某一数据时由于执行顺序不确定性以及中断的不可预知性产生的数据不一致问题。 该操作通过将内存中的值与指定数据进行比较,当数值一样时将内存中的数据替换为新的值。

  它将内存位置的内容与给定值进行比较,只有在相同的情况下,将该内存位置的内容修改为新的给定值。 这是作为单个原子操作完成的。 原子性保证新值基于最新信息计算; 如果该值在同一时间被另一个线程更新,则写入将失败。 操作结果必须说明是否进行替换; 这可以通过一个简单的布尔响应(这个变体通常称为比较和设置),或通过返回从内存位置读取的值来完成(摘自维基本科)

CAS包含3个参数:

  V表示要更新的变量

  E表示预期值

  N表示新值

如果V值等于E值,则将V的值设为N。若V值和E值不同,则说明已经有其他线程做了更新,则当前线程什么都不做。通俗的理解就是CAS操作需要我们提供一个期望值,当期望值与当前线程的变量值相同时,说明还没线程修改该值,当前线程可以进行修改,也就是执行CAS操作,但如果期望值与当前线程不符,则说明该值已被其他线程修改,此时不执行更新操作,但可以选择重新读取该变量再尝试再次修改该变量,也可以放弃操作,原

4 java  lock底层实现

5 多线程包

7 lock synchronized 

8 同步方法 VS 同步代码块:

  java中,每一个对象都有一把锁,线程用synchronized获取对象上的锁。

  非静态同步方法:锁是类的对象的锁。

  静态同步方法:锁的是类本身。

  同步方法块:锁是可以选择的。所以能更加精确的控制。粒度更细致,可以更精确的控制对象锁。

9 确保N个线程可以访问N个资源而不死锁?

  指定资源获取顺序。所有线程都按照同样的顺序请求资源。

10 创建线程的方法:

  继承Thread

  实现Runnable接口:这种方式更受欢迎,因为可以继承其他的类。

  Executor框架创建线程池

11 线程的几种可用状态:

  new:刚创建的线程,但是没有调用start。

  就绪(Runnable):调用start, run()方法就执行,但是不一定马上执行。等待时间片。

  运行(Running) :得到CPU可以执行,正在执行。

  阻塞(waitting):正在运行到线程,暂时让出CPU。各种原因可以导致阻塞:

              sleep():调用一个在I/O上被阻塞的操作,即该操作在输入/输出完成前不会返回到调用者。

              等待锁。Join() 也可以导致当前线程blocked。

                             进入临界区,等待锁(synchronized,  wait,  interruped )

  死亡:run() 方法正常退出,自然死亡。未捕获到异常终止了run方法而使线程猝死。

12 Thread类最佳实践

  写的时候最好要设置线程名称 Thread.name,并设置线程组 ThreadGroup,目的是方便管理。在出现问题的时候,打印线程栈 (jstack -pid) 一眼就可以看出是哪个线程出的问题,这个线程是干什么的。

二十四 java 多线程一些知识点的更多相关文章

  1. JavaEE基础(二十四)/多线程

    1.多线程(多线程的引入) 1.什么是线程 线程是程序执行的一条路径, 一个进程中可以包含多条线程 多线程并发执行可以提高程序的效率, 可以同时完成多项工作 2.多线程的应用场景 红蜘蛛同时共享屏幕给 ...

  2. JDK源码阅读-------自学笔记(二十四)(java.util.LinkedList 再探 自定义讲解)

    一.实现get方法 1.一般思维实现思路 1).将对象的值放入一个中间变量中. 2).遍历索引值,将中间量的下一个元素赋值给中间量. 3).返回中间量中的元素值. 4).示意图 get(2),传入角标 ...

  3. Java学习笔记二十四:Java中的Object类

    Java中的Object类 一:什么是Object类: Object类是所有类的父类,相当于所有类的老祖宗,如果一个类没有使用extends关键字明确标识继承另外一个类,那么这个类默认继承Object ...

  4. Java进阶(二十四)Java List集合add与set方法原理简介

    Java List集合add与set方法原理简介 add方法 add方法用于向集合列表中添加对象. 语法1 用于在列表的尾部插入指定元素.如果List集合对象由于调用add方法而发生更改,则返回 tr ...

  5. JAVA之旅(二十四)——I/O流,字符流,FileWriter,IOException,文件续写,FileReader,小练习

    JAVA之旅(二十四)--I/O流,字符流,FileWriter,IOException,文件续写,FileReader,小练习 JAVA之旅林林总总也是写了二十多篇了,我们今天终于是接触到了I/O了 ...

  6. (C/C++学习笔记) 二十四. 知识补充

    二十四. 知识补充 ● 子类调用父类构造函数 ※ 为什么子类要调用父类的构造函数? 因为子类继承父类,会继承到父类中的数据,所以子类在进行对象初始化时,先调用父类的构造函数,这就是子类的实例化过程. ...

  7. Bootstrap<基础二十四> 缩略图

    Bootstrap 缩略图.大多数站点都需要在网格中布局图像.视频.文本等.Bootstrap 通过缩略图为此提供了一种简便的方式.使用 Bootstrap 创建缩略图的步骤如下: 在图像周围添加带有 ...

  8. 二十四、Struts2中的UI标签

    二十四.Struts2中的UI标签 Struts2中UI标签的优势: 数据回显 页面布局和排版(Freemark),struts2提供了一些常用的排版(主题:xhtml默认 simple ajax) ...

  9. WCF技术剖析之二十四: ServiceDebugBehavior服务行为是如何实现异常的传播的?

    原文:WCF技术剖析之二十四: ServiceDebugBehavior服务行为是如何实现异常的传播的? 服务端只有抛出FaultException异常才能被正常地序列化成Fault消息,并实现向客户 ...

随机推荐

  1. vs编译自定义编译任务记录,msbuild

    https://www.cnblogs.com/whitewolf/archive/2011/07/27/2119005.html http://www.cnblogs.com/hjf1223/arc ...

  2. 安装pip的三种方式

    pip是python的一个工具,用来安装python包特别方便.Linux系统是是内置python程序,因为许多Linux内置文件都是使用python来编写的,比如说yum. 1.脚本安装 通过脚本的 ...

  3. 验证账号密码是否为空 if格式

    当前台页面是否提示有没有输入账号密码时 这时需要验证 //验证账号是否为空 if(string.IsNullOrEmpty(zh)) { //为空 则提示输入账号 ObjToJsin.msg = &q ...

  4. Mxnet框架搭建

    Mxnet框架搭建 小书匠 kindle  Mxnet是亚马逊开发的深度学习框架,和谷歌Tensorflow是同类型的框架. 1.安装Mxnet 这里只展示在线安装,源码编译安装等不演示:GPU安装与 ...

  5. gulp4配置多页面项目编译打包

    又开始公司的新项目了... 那当我们拿到公司新项目的时候我们需要做些什么呢? 下面就来分享一下我的工作步骤吧(仅使用于初学者,大神勿见怪- -,有不好的地方希望指出,十分感谢) 1. 整版浏览 这是一 ...

  6. MySQL 聚集拼接

    GROUP_CONCAT()函数 示例: 假设现在有这样一个表结构: 其中`student`.`school_id`是逻辑外键 想要检索出所有学校,其中学校下的学生名需要拼接在一起,作为结果集的字段 ...

  7. linux环境下固定ip操作

    背景: 使用虚拟机管理软件VMvare workstation 安装好liunx虚拟机(centos)成功,下面为了固定linux的ip进行一系列设置 参考的文件有部分不是很详细,在借鉴它的基础上进行 ...

  8. springBoot学习(二):初学JPA

    依旧跟着大佬学习JPA,在这里记下过程. JPA主要做的事情是简化数据库操作,至少现在为止,我觉得还是挺方便简单明了的.在原本代码的基础下,更改UserController.User.UserRepo ...

  9. OpenJudge 1.5.27:级数求和

    描述 已知:Sn= 1+1/2+1/3+…+1/n.显然对于任意一个整数K,当n足够大的时候,Sn大于K. 现给出一个整数K(1<=k<=15),要求计算出一个最小的n:使得Sn>K ...

  10. (转)服务端监控工具:nmon的使用

    在性能测试过程中,对服务端的各项资源使用情况进行监控是很重要的一环.这篇博客,介绍下服务端监控工具:nmon的使用方法.. 一.认识nmon 1.简介 nmon是一种在AIX与各种Linux操作系统上 ...