java 多线程不执行命令_Java多线程

静态方法和普通方法同时加上synchronized有什么区别?

A. 无论synchronized关键字加在方法上还是对象上,如果它作用的对象是非静态的,则它取得的锁是对象;如果synchronized作用的对象是一个静态方法或一个类,则它取得的锁是对类,该类所有的对象同一把锁。

B. 每个对象只有一个锁(lock)与之相关联,谁拿到这个锁谁就可以运行它所控制的那段代码。

C. 实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避免无谓的同步控制。

线程池的类型,固定大小的线程池内部是如何实现的,等待队列是用了哪一个队列实现

线程池的底层实现

谈一谈对volatile理解,这个问题很常见,答出要点: 可见性、防止指令重排即可

多线程:创建多线程的三种方法及其区别,线程同步方法,synchronize和ReentrantLock的区别,synchronize的用法(修饰类,方法,代码块等)以及使用对象是什么,sleep和wait的区别

指令重排的含义

volatile 原理 使用 指令重排 内存屏障 保证内存可见性

volatile实现,锁分类介绍、AQS介绍、公平锁非公平锁介绍。

volatile关键字

volatile关键字是Java并发的最轻量级实现,本质上有两个功能,在生成的汇编语句中加入LOCK关键字和内存屏障 作用就是保证每一次线程load和write两个操作,都会直接从主内存中进行读取和覆盖,而非普通变量从线程内的工作空间(默认各位已经熟悉Java多线程内存模型)

但它有一个很致命的缺点,导致它的使用范围不多,就是他只保证在读取和写入这两个过程是线程安全的。如果我们对一个volatile修饰的变量进行多线程下的自增操作,还是会出现线程安全问题。根本原因在于volatile关键字无法对自增进行安全性修饰,因为自增分为三步,读取-》+1-》写入。中间多个线程同时执行+1操作,还是会出现线程安全性问题。

synchronized

锁的优化:偏向锁、轻量级锁、自旋锁、重量级锁

锁的膨胀模型,以及锁的优化原理,为什么要这样设计

与Concurrent包下的Lock的区别和联系

Lock能够实现synchronized的所有功能,同时,能够实现长时间请求不到锁时自动放弃、通过构造方法实现公平锁、出现异常时synchronized会由JVM自动释放,而Lock必须手动释放,因此我们需要把unLock()方法放在finally{}语句块中

concurrentHashMap

两个hash过程,第一次找到所在的桶,并将桶锁定,第二次执行写操作。

而读操作不加锁,JDK1.8中ConcurrentHashMap从1600行激增到6000行,中间做了很多细粒度的优化,大家可以查一下。

锁的优化策略

① 读写分离

② 分段加锁

③ 减少锁持有的时间

④ 多个线程尽量以相同的顺序去获取资源

等等,这些都不是绝对原则,都要根据情况,比如不能将锁的粒度过于细化,不然可能会出现线程的加锁和释放次数过多,反而效率不如一次加一把大锁。这部分跟面试官谈了很久

线程池的配置 Excutor 以及Connector的配置

线程池的种类、原理(threadpoolexecutor)、threadpoolexecutor的参数有哪些?

线程池的基本思想还是一种对象池的思想,开辟一块内存空间,里面存放了众多(未死亡)的线程,池中线程执行调度由池管理器来处理。当有线程任务时,从池中取一个,执行完成后线程对象归池,这样可以避免反复创建线程对象所带来的性能开销,节省了系统的资源。就好比原来去食堂打饭是每个人看谁抢的赢,谁先抢到谁先吃,有了线程吃之后,就是排好队形,今天我跟你关系好,你先来吃饭。比如:一个应用要和网络打交道,有很多步骤需要访问网络,为了不阻塞主线程,每个步骤都创建个线程,在线程中和网络交互,用线程池就变的简单,线程池是对线程的一种封装,让线程用起来更加简便,只需要创一个线程池,把这些步骤像任务一样放进线程池,在程序销毁时只要调用线程池的销毁函数即可。

单个线程的弊端:

a. 每次new Thread新建对象性能差

b. 线程缺乏统一管理,可能无限制新建线程,相互之间竞争,及可能占用过多系统资源导致死机或者OOM,

c. 缺乏更多功能,如定时执行、定期执行、线程中断。

Java提供的四种线程池的好处在于:

a. 重用存在的线程,减少对象创建、消亡的开销,性能佳。

b. 可有效控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞。

c. 提供定时执行、定期执行、单线程、并发数控制等功能。

Java通过Executors提供四种线程池,分别为:

newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。

newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。

newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。

newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。

(1). newCachedThreadPool

创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。线程池为无限大,当执行第二个任务时第一个任务已经完成,会复用执行第一个任务的线程,而不用每次新建线程。

(2). newFixedThreadPool

创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。

(3). newScheduledThreadPool

创建一个定长线程池,支持定时及周期性任务执行。ScheduledExecutorService比Timer更安全,功能更强大

(4). newSingleThreadExecutor

创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行

线程通信、同步的方法。

Lock 比起 Synchronized 的优势在哪里;读写锁的优势。

锁的类型、重入锁的原理(aqs)、aqs的常用方法

synchronized可重入吗?

synchronized可以替代读写锁吗?

Lock内部实现

终止线程有几种方式?终止线程标记变量为什么是 valotile 类型?

用过哪些并发的数据结构? cyclicBarrier 什么功能?信号量作用?数据库读写阻塞怎么解决

线程的中断

线程的Interrupt中断,其实只是修改线程的中断位,并不会真正停止线程。(1)可以通过Thread的类方法interrupted检查当前线程是否中断,但是会重置标志位(2)通过调用Thread的普通方法isInterrupted来检查中断位,不会重置标志位。

线程调用中断方法不会停止程序,那么有什么用?

谈了谈线程池中,线程销毁,假如没有中断那么就一直while检查不断执行任务。如果中断后,就return方法。就是return Runnable的run方法,线程运行完毕自然就可以销毁。(下来查资料看到真正的中断用法)其实中断线程有很多方法:(1)通过检查标志位用break退出循环(2)通过return退出run方法(3)通过对有些状态中断抛异常退出。

多线程,线程同步,锁

sleep 与 wait 方法的区别

5842caa05f89?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

image.png

synchronized 与 volatile 的比较,哪个保证原子性

CountDownLatch

BLOCKED 与 TIMED_WAITING 的区别

Java 多线程机制,锁

自旋锁

redis的配置文件(AOF&&Snapshot&&主从复制)

Java多线程,线程池有哪几类,每一类的差别

ThreadLocal原理,线程池工作流程

synchronized 实现原理

ReentrantLock源码,AQS,synchronized实现

Thread中,ThreadLocal,Lock等

一道线程通信问题,给你三个线程,然后分别处理任务,再交给主线程,你如何实现。

线程池有几种实现方式,分别介绍一下(ThreadPoolExecutor, Executors里面有四种,其实都是调用的ThreadPoolExecutor), Executors中四种实现方式的区别,项目中用的哪种实现方式,我说newFixedThreadPool, 线程数 设置为多大,根据什么依据。这种实现方式下,用的什么阻塞队列,默认队列的长度是多少

ConcurrentHashMap原理,jdk1.8后有哪些改变(引入CAS等)

问为什么项目中需要只用ConcurrentHashMap做缓存,和Redis有什么区别吗(map可以作为内存式缓存,短时间访问量高可以使用)

ConucrrentHashmap原理,Java8做了哪些改变,有引入CAS,问什么是CAS,和自旋锁有什么区别

Redis在项目中怎么使用的,我说做缓存,用户token存放在redis中,有提到在redis中维持一个订单流水号保证唯一性,问为什么redis中可以保证,主要就是redis是单线程的,redis中命令都是原子操作

redis怎么实现分布式锁(sentnx命令可以实现)

线程池怎么实现的?线程池中线程的数量怎么设定? jdk 怎么监控线程状态与线程数量? jstack 打印线程状态,分析线程负载状况? linkedBlockingQuene 与 ArraylistQuene 区别

信号量是什么,怎么使用

阻塞队列了解吗?怎么使用

  • 1
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:1024 设计师:我叫白小胖 返回首页
评论

打赏作者

梧桐叶的梦

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值