创建线程有两种方式: 线程总共有六种状态,分别是: 在多线程的情况下,由于每个线程都有个工作内存,操作数据时会首先将数据从主内存拷贝到工作内存中。所以如果多个线程都要对同一个变量进行修改时,就会产生数据不一致的问题。 常见的创建线程池的方式有四种,分别是: 这样创建线程要注意使用的任务队列是LinkedBlockingQueue,很容易导致OOM的发生 在JDK1.6中新增了轻量级锁和偏向锁的来提高锁的效率。锁会从偏向锁升级到轻量级锁再升级到重量级锁。 有volatile修饰的共享变量在进行写操作时的汇编代码是具有lock前缀的指令,lock前缀的指令在多核处理器下会引发两件事: 多处理器下,为了保证各个处理器的缓存是一致的就会实现缓存一致性协议,每个处理器通过嗅探在总线上传播的数据来检查自己缓存的值是不是过期了,当处理器发现自己缓存行对应的内存地址被修改,就会将当前处理器的缓存行设置为无效状态,当处理器对这个数据进行修改操作的时候,会重新从系统内存中把数据读到处理器缓存里。 单例模式就是某个类的实例在多线程的环境下只会被创建一次。 饿汉式:调用方法前就已经创建好了实例 懒汉式:在第一次调用方法时才开始创建 这里要注意变量用volatile修饰变量保证可见性,还有使用双重校验锁的方式保证多线程访问的安全性 双重校验锁是指使用了两次if条件判断。如果只使用一次判定,那么当多个线程同时判定为null后只有一个线程竞争到锁其它线程阻塞,获取到锁的线程开始初始化变量,当初始化结束后释放锁。此时其它线程继续竞争到锁后又会开始创建实例,如果加上校验,那就避免了这一情况的发生提高了效率。 Java锁是用于保障在多线程并发情况下的数据一致性,线程必须获得锁才可以对共享变量进行操作。 atomic包是是 Lock是一个接口可以实现锁的功能,提供了与synchronized相似的同步功能。但是在使用时需要显式的获取锁和释放锁,提高了锁的获取、释放的可操作性。使用时要将释放锁的操作放到finally代码块中保证锁可以释放成功。 AQS 全称为AbstractQueuedSychronizer,就是抽象队列同步器。它是 synchronized是Java中的一个关键字,ReentrantLock是Java中的一个类 欢迎!如果想加一波关注那就再好不过了😁
🚩创建线程有几种方式?
🚩线程有哪几种状态?
🚩sleep()和wait()的区别?
🚩yield()和join的区别?
🚩run()和start()方法有什么区别?
🚩怎么中断一个线程呢?
isInterrupted()
方法可以检查这个线程是否被中断,不会影响标志位。interrupted()
方法也可检测线程是否中断,再调用该方法后,如果线程标志位是true会重置为false🚩什么是线程安全问题?如何解决?
如果要解决这种问题可以对数据进行加锁操作,使用synchronized关键字,或使用显式的Lock锁来保证每次只有一个线程对变量进行修改。🚩线程池了解吗?
(1)核心线程数:当线程数小于核心线程数,加入的任务都会创建一个新的线程
(2)最大线程数:线程池最大允许有的线程数,任务队列满后还没到达最大线程数时就可以创建该线程执行任务
(3)最大等待时间:线程数大于核心线程时,空闲的线程等待的最大时间,超过就终止线程
(4)任务队列:当核心线程都在工作是,再次加入的任务就会加入到任务队列来等待执行
(5)拒绝策略:当任务队列已满,线程池线程数以达到最大线程数就会启用拒绝策略,总共有四种,分别是:直接抛出异常(默认)、直接丢弃、丢弃任务队列中最旧的任务、交给调用任务的线程进行执行。🚩创建线程池有几种方式?
new FixedThreadPool(int nThreads)
:创建一个固定数量的线程池,每次提交一个任务就创建一个工作线程,如果工作线程达到初始数量就放入任务队列new CachedThreadPool
:创建一个可缓存线程池,可灵活回收空闲线程,若无可回收,则新建线程。创建数量几乎没有限制,如果长时间没有往线程池中提交任务,工作线程将自动终止。new SingleThreadExecutor()
:创建一个只有一个线程的线程池,可以保证所有的任务都能按顺序执行到new ScheduleThreadPool()
:创建一个定长的线程池,支持定时、延时的执行任务🚩执行execute()和submit()方法区别是什么呢?
🚩了解synchronized关键字吗?
access_flags
中设置ACC_SYNCHRONIZED
标志,如果线程竞争锁,发现已经设置了这个标志,就表示该对象锁已经有线程持有。🚩了解synchronized锁优化机制吗?
🚩偏向锁、轻量级锁和重量级锁的区别?
🚩了解volatile关键字吗?
🚩volatile的底层是怎么实现的?
🚩说说synchronized和volatile的区别?
🚩生产者消费者模型作用是什么?
🚩实现一个生产者消费者模型?
public class ProduceAndConsume { //设置共享变量COUNT private static volatile int COUNT; public static void main(String[] args) { //生产者 //创建三个线程,每一个线程就为一个生产者,生产者执行一次使得COUNT + 1 for (int i = 0; i < 3; i++) { new Thread(new Runnable() { @Override public void run() { try { //每个生产者可以连续工作十次 for (int j = 0; j < 10; j++) { synchronized (ProduceAndConsume.class) { //如果生产者生产后,COUNT>10就开始等待 //注意:此处不使用if判断是为了防止wait方法返回后不能及时再次判断COUNT while (COUNT + 1 > 10) { //当前线程释放锁,等待唤醒 ProduceAndConsume.class.wait(); } //库存不满就生产 produce(); System.out.println(Thread.currentThread().getName() + "生产,库存总量为" + COUNT); //每次生产后睡眠一段时间 Thread.sleep(500); //生产后有库存,就唤醒所有等待的消费者 ProduceAndConsume.class.notifyAll(); } //睡眠一段时间,留出时间让其他线程竞争锁 Thread.sleep(500); } } catch (InterruptedException e) { e.printStackTrace(); } } }).start(); } //消费者 //创建三个线程,表示有三个消费者 for (int i = 0; i < 3; i++) { new Thread(new Runnable() { @Override public void run() { try { while(true) { //三个消费者均可一直消费 synchronized (ProduceAndConsume.class) { //库存为0,则停止消费 while (COUNT == 0) { ProduceAndConsume.class.wait(); } consume(); System.out.println(Thread.currentThread().getName() + "消费,库存总量为" + COUNT); Thread.sleep(500); ProduceAndConsume.class.notifyAll(); } Thread.sleep(500); } } catch (InterruptedException e) { e.printStackTrace(); } } }).start(); } } //生产消费的同步方法 public static synchronized void produce(){ COUNT ++; } public static synchronized void consume(){ COUNT --; } }
🚩单例模式了解吗?
单例模式有两种安全写法:饿汉模式和基于双重校验锁的懒汉模式🚩写一个单例模式?
public class Singleton { private static Singleton instance = new Singleton(); private Singleton(){} public static Singleton getInstance() { return instance; } }
public class Singleton { private static volatile Singleton instance; private Singleton(){} public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) { instance = new Singleton(); } } } return instance; } }
🚩为什么要使用双重校验锁以及volatile关键字?
使用volitile修饰保证了变量的可见性和禁止指令重排序。在new一个对象时,虚拟机会将整个步骤分为三步:分配内存空间、初始化对象、将内存空间赋值给变量。在这三步骤中,虚拟机为了了提高效率可能会对指令进行重排序。也就有可能出现对象还没被初始化但是instance确指向该内存空间。如果此时有一个线程来访问变量,就会得到错误的值,所以为了解决这个问题,可以使用volatile关键字禁止指令的重排序。🚩Java锁有什么作用?有哪些分类?
🚩什么是乐观锁和悲观锁?
🚩什么是公平锁和非公平锁?
🚩什么是CAS?有什么问题?
🚩如何进行锁优化?
🚩atomic包下的原子类有了解吗?
java.util.concurrent
包中的一个原子类集合,其中包含了不同类型的多个原子类都是基于CAS机制的基础下实现。使得原子类型的变量都可以实现原子的自增和自减操作。主要包括4类,原子更新基本类型、原子更新数组、原子更新引用类型和原子更新属性。在原子更新属性类中有支持带有版本号的更新方法,可用于解决CAS操作时出现的ABA问题。🚩Lock 了解吗?
🚩什么是AQS?
java.util.concurrent.locks
包下的一个抽象类,是用来构建锁的一个基础框架,子类通过继承同步器并实现它的抽象方法来管理同步状态,它使用了一个volatile的int变量来表示同步状态,通过内置的FIFO队列来完成资源的获取线程的排队工作。
总的来说,锁式面向使用者的,定义了使用者与锁交互的接口,隐藏了细节;同步器是面向锁的实现者的,简化了锁的实现,线程排队唤醒的操作。🚩synchronized和ReentrantLock有什么区别?
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算