首页 > 编程语言 >Java面试题Day09

Java面试题Day09

时间:2023-01-16 20:23:49浏览次数:36  
标签:面试题 同步 Java synchronized Day09 线程 sleep 方法 volatile

1.创建线程的三种方法

(1)继承Thread类,重写父类run()方法.

(2)实现runnable接口

(3)使用ExcutorService,Callable,Future实现有返回结果的多线程(JDK1.5以后)

2.多线程同步机制

(1)在需要同步的方法的方法签名中加入synchronized关键字

(2)在使用synchronized块对需要进行同步的代码段进行同步

(3)使用JDK5中提供的Java.util.concurrent.lock包中的Lock对象

3.线程的几种可用状态(生命周期)

就绪(Runnable):线程准备运行,不一定立马就能开始执行.

运行中(Running):线程正在执行线程的代码.

等待中(Waiting):线程处于阻塞的状态,等待外部的处理结果.

睡眠中(Sleeping):线程被强制睡眠.

I/O阻塞(Blocked on I/O):等待I/O操作完成,

同步阻塞(Blocked on Synchronization):等待获取锁.

死亡(Dead):线程完成了执行.

4.线程锁对象详解.

当多个线程同时访问共享数据时,可能导致数据不同步,甚至错误!

适用于密集型操作,需要资源保持同步,需要用到线程锁

优缺点:

优点:保证资源同步

缺点:有等待肯定会慢

5.同步方法的实现方式

(1)同步方法:有synchronized关键字修饰的方法

(2)同步代码块:有synchronized关键字修饰的语句块

(3)使用特殊域变量(volatile)实现线程同步:volatile关键字为域变量的访问提供了一种免锁机制

(4)使用重入锁实现线程同步

(5)使用局部变量threadlocal实现线程同步

(6)使用阻塞队列实现线程同步

(7)使用原子变量实现线程同步

6.什么是死锁(deadlock)如何避免死锁?

两个进程都在等待对方执行完毕才能继续往下执行的时候就发生了死锁,

避免死锁的方式就是:指定获取锁的顺序,并强制线程按照指定的顺序获取锁.

7.sleep方法和wait方法的区别?

来自不同的类:wait()方法是Object类的方法,sleep方法是Thread类的方法.

对于锁的占用情况不同:sleep方法没有释放锁,而wait方法释放了锁

使用范围:wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep()可以在任何地方使用

唤醒方式:sleep()方法的线程通常是睡眠一定时间后,自动醒来,调用wait()方法,必须采用notify()或者notifyAll()方法唤醒

8.线程局部变量ThreadLocal

ThreadLocal的作用和目的:

用于实现线程内的数据共享,相同的程序代码下多个模块在同一个线程中运行时要共享一份数据

ThreadLocal的应用场景:

订单处理包含一系列操作

银行转账包含一系列操作

同一段代码被不同的线程调用运行时

9.什么是守护线程

守护线程(即daemon thread),是个服务线程,服务于其他的用户线程

(1).守护线程,比如垃圾回收线程,就是最典型的守护线程,

(2).用户线程,就是应用程序里的自定义线程

用户自定义线程

(1).应用程序里的线程,一般都是用户自定义线程

(2).用户也可以自定义守护线程,只需要调用Thread类的设置方法设置一下即可.

10.synchronized和volatile比较

(1)volatile不需要加锁,比synchronized更轻便,不会阻塞线程,

(2)synchronized既能保证可见性,又能保证原子性,而volatile只能保证可见性,无法保证原子性

标签:面试题,同步,Java,synchronized,Day09,线程,sleep,方法,volatile
From: https://www.cnblogs.com/carney/p/17046294.html

相关文章

  • JavaScript学习笔记—函数中的this
    this函数在执行时,JS解析器每次都会传递进一个隐含的参数,即thisthis会指向一个对象,所指向的对象会根据函数调用方式的不同而不同(1)以函数形式调用时,this指向的是window(2......
  • 【问题解决】Tomcat启动服务时提示Filter初始化或销毁出现java.lang.AbstractMethodEr
    问题背景最近在开发项目接口,基于SpringBoot2.6.8,最终部署到外置Tomcat8.5.85下,开发过程中写了一个CookieFilter,实现javax.servlet.Filter接口,代码编译期正常。部署到外......
  • 【Javaweb】动态web工程目录介绍
    src存放自己编写的Java源代码web专门用来存放web工程的资源文件(html页面、css文件、js文件等等)WEB-INF是一个受服务器保护的目录,浏览器无法直接访问此目录的内容web.......
  • JAVA基础强化Day3
    总结运算符(1) 算术运算符:+-*/++--(2) 逻辑运算符:① 逻辑与&,逻辑非!,逻辑或|② 逻辑与短路&&,逻辑或短路||③ 区别:&无论前面是真假后面的语句都会执行,无断......
  • JavaScript 回调函数
    函数实际上是对象:它们能被“存储”在变量中,能作为函数参数被传递,能在函数中被创建,能从函数中返回;回调函数回调函数就是一个参数,将这个函数作为参数传到另一个函数里面,当......
  • 7.java变量
    7.java变量7.1变量定义​Java语言中,所有的变量在使用前必须声明,声明之后使用之前必须进行赋值。声明变量的基本格式如下:​typevariable[=value][,vari......
  • 【Javaweb】tomcat目录介绍
    bin专门用来存放tomcat服务器的可执行程序conf专门用来存放tomcat服务器的配置文件lib专门用来存放tomcat服务器的jar包logs专门用来存放tomcat服务器运行时输出的......
  • 【Java】eclipse如何导入项目
    【Java】eclipse如何导入项目1.第一步,打开eclipse,点击file->import2.第二步,选择general->existingprojectsintoworkspace(即常规-现有项目导入到工作空间)3.第三步,选择bro......
  • 【Java】监听jframe窗口大小改变函数:addComponentListener
    问题描述:主要用于解决Jframe窗口大小变化时,里面的组件的位置也会自适应的移动。相当于js里面的窗口大小改变监听函数:window.onresize=function(){//js脚本接口}......
  • 【Java】Java连接Mysql数据库的demo示例
    【Java】Java连接Mysql数据库的demo示例1.安装mysql数据库2.下载java-mysql-connector.jar包3.完成java配置4.写java代码运行测试1.安装mysql数据库这里不多重复,我主要讲......