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