多线程

Java常见面试题

你说的曾经没有我的故事 提交于 2020-03-04 04:24:06
Java开发岗位面试常问题 一、Java基础 1、String类为什么是final的. 2、HashMap的源码,实现原理,底层结构. 3、说说你知道的几个Java集合类:list、set、queue、map实现类咯... 4、描述一下ArrayList和LinkedList各自实现和区别 5、Java中的队列都有哪些,有什么区别. 6、反射中,Class.forName和classloader的区别 7、Java7、Java8的新特性(baidu问的,好BT) 8、Java数组和链表两种结构的操作效率,在哪些情况下(从开头开始,从结尾开始,从中间开始),哪些操作(插入,查找,删除)的效率高 9、Java内存泄露的问题调查定位:jmap,jstack的使用等等 10、string、stringbuilder、stringbuffer区别 11、hashtable和hashmap的区别 13、异常的结构,运行时异常和非运行时异常,各举个例子 14、String a= "abc" String b = "abc" String c = new String("abc") String d = "ab" + "c" .他们之间用 == 比较的结果 15、String 类的常用方法 16、Java 的引用类型有哪几种 17、抽象类和接口的区别 18、java的基础类型和字节大小. 19

多线程,线程通信,线程池和lambda表达式

随声附和 提交于 2020-03-04 03:29:05
多线程,线程通信,线程池和lambda表达式 1.多线程waiting(无限次等待) 此线程被执行wait时,需要等另一个线程唤醒 public void wait(); 所在线程进入等待并开启锁对象 public void notify(); 唤醒和锁有关的任意一个等待的线程,并开启锁 public void notifyAll(); 唤醒所有与锁有关的等待的线程并开启锁, 2.线程通信 多个完全无关的线程共享资源为同一个事物,需要解决共享资源问题,解决的办法是:创建多个线程对象时,使用同一个商品类对象,作为构造方法参数进行初始化操作 3. 线程池 继承Thread和遵从Runnable接口,都要重写Run方法,每一个线程对象只能执行一次,之后就被销毁。 利用Runnable接口来提供执行目标,而且借助于Thread执行线程。 线程池 ==> 可以容纳多个线程的容器,程序可以从线程池获取线程来完成目标代码,同时也可以将线程归还给线程池。省去了创建线程和销毁线程这样非常繁琐的操作。 使用方法 public static ExecutorService newFixedThreadPool(int nThreads); 得到一个线程对象,初始化参数是要求的当前线程池中的线程数 public Future submit(Runnable target); 从线程池中获取一个线程对象

高并发、多线程、分布式都不懂,你拿什么跳槽阿里、腾讯、京东?

本小妞迷上赌 提交于 2020-03-04 02:04:44
Java多线程与高并发实战实践 先来看看高并发多线程一些大厂并发面试题,看你能答出几道! (1)synchronized的CPU原语级别是如何实现的? (2) 无锁、偏向锁、轻量级锁、重量级锁 有什么差别,升级过程如何? (3) 线程 间通信, 同机器进程 间通信, 跨机器进程 间通信,各有什么方法? (4)下列三种业务,应该如何使用线程池: 高并发、任务执行时间短 的业务 并发不高、任务执行时间长 的业务 并发高、业务执行时间长 的业务 (5)秒杀系统,如何能够撑住100W级别TPS(淘宝最高54万TPS)? 如果平时只有CRUD的经验,不了解多线程与高并发,面对这样面试题,大概率一头雾水。 Java高并发常问面试题 synchronized关键字的字节码原语; volatile关键字的字节码原语; synchronized与volatile的硬件级实现; 无锁、偏向锁、轻量级锁、重量级锁的升级过程; 内存屏障的基本概念; JVM规范如何要求内存屏障; 硬件层级内存屏障如何帮助java实现高并发; 面试第3题(线程间通讯)的8种解法; Java多线程一线互联网常问面试题 线程池的学与思; 使用线程池的好与不好; 为什么阿里开发手册建议自定义线程池; 自定义线程池的最佳实践; 常见线程池类型与应用场景: 1)CachedPool 2)FixedThreadPool 3

Day 22多线程、线程通信、线程池和Lambda表达式

ⅰ亾dé卋堺 提交于 2020-03-04 01:18:39
Day 22 Author:ScorpioDong 1. 多线程 1.1 WAITING(无限等待) 当某一线程被执行wait()方法,需要等待其他线程进行唤醒操作。 public void wait(); 当前线程进入无线等待状态 开启锁对象 public void notify(); 唤醒一个当前锁对象有关的无线等待线程,随机选择 开启锁对象 public void notifyAll(); 唤醒所有和当前锁对象有关的线程 开启锁对象 进入锁对象抢占过程,有可能进入锁阻塞状态 2. 线程通信 现在存在两个完全无关的线程,生产者和消费者,但是商品会作为他们两者之间的共享资源。 生产者和消费者中都有一个成员变量 商品类型 【解决方案】 创建生产者或者消费者线程对象时,使用同一个商品类对象,作为构造方法参数进行初始化操作 3. 线程池 不管是继承Thread还是遵从Runnable接口,都需要重写Run方法,而且每一个线程对象有且只能执行一次,之后就会被销毁。 利用Runnable接口来提供执行目标,而且借助于Thread执行线程。 线程池 ==> 可以容纳多个线程的容器 程序可以从线程池获取线程来完成目标代码 同时也可以将线程归还给线程池。 省去了创建线程和销毁线程这样非常繁琐的操作。 线程池使用: public static ExecutorService

Java多线程与JUC——01理解进程线程的概念

青春壹個敷衍的年華 提交于 2020-03-03 22:15:36
今天开始认真的学一下Java线程与JUC,所以开辟一个新的专栏来记录笔记。希望也能对你的学习有所帮助,喜欢的话就多多关注我吧。我会一直将我的笔记传到我的博客上与大家分享交流。 1.进程 几乎所有的操作系统都支持进程概念,进程是处于运行过程中的程序, 进程是操作系统中进行资源分配的基本单位。 一般而言进程包含如下三个基本特征 。 独立性 :指进程实体是一个能独立运行、独立获得资源和独立接受调度的基本单位。而对于未建立任何进程的程序,都不能作为一个独立的单位来运行。没有进程本身的同意,其他进程是不能访问到该进程所有的地址空间。 动态性 :进程与程序的区别在于, 程序只是一个静态的指令集合 ,而 进程是一个正在系统中活动的指令集合 。在进程中加入了时间的概念。进程具有自己的生平周期和各种不同的状态,这些概念在程序中都是不具备的。 并发性 :多个进程可以在单个处理器上并发执行。 并发性与并行性的区别 并行性 :指在同一时刻,有多条指令在多个处理器上同时执行; 并发性 :指在同一时刻只能有一条指令执行。但 多个进程指令被快速轮换执行 ,使得宏观上具有多个进程同时执行的效果。 进程是状态 2.线程 线程则扩展了进程的概念,使得同一个进程可以同时并发出多个任务 线程是进程的执行单元,是进程的组成部分,一个进程可以拥有多个线程,每个线程必须有一个父进程。 线程是独立运行的

Objective-C-GCD

女生的网名这么多〃 提交于 2020-03-03 21:20:26
队列 & 线程的执行方式(任务) 任务:block,消息等函数块,他是由线程执行的。 线程执行任务的方式: 同步线程:当前线程a只能执行完事件A才能执行任务B。 异步线程:当前线程a执行A的时候又开了个线程b,执行任务B 队列:存储任务 串行队列:一个任务(block)接着一个任务的出队。一般由一个线程处理这一个队列 并发队列:一次有多个任务出队,由多个线程处理。使用异步线程执行。 2.GCD: 线程执行方式: 同步:dispatch_sync 异步:dispatch_async 队列: 串行:串行队列,dispatch_queue_create,主队列dispatch_get_main_queue 并发:全局队列,dispatch_get_global_queue mainThread <--->mainQueue 3.GCD线程间通信图: 4. dispatch_async(dispatch_get_global_queue(0, 0), ^{ NSLog(@"download:%@", [NSThread currentThread]); NSURL *url = [NSURL URLWithString:@"http://pic.nipic.com/2007-12-06/2007126205543511_2.jpg"]; NSData *data = [NSData

java中volatile关键字的含义

牧云@^-^@ 提交于 2020-03-03 18:55:51
转自:http://www.cnblogs.com/aigongsi/archive/2012/04/01/2429166.html 在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉。 Java语言是支持多线程的,为了解决线程并发的问题,在语言内部引入了 同步块 和 volatile 关键字机制。 synchronized 同步块大家都比较熟悉,通过 synchronized 关键字来实现,所有加上synchronized 和 块语句,在多线程访问的时候,同一时刻只能有一个线程能够用 synchronized 修饰的方法 或者 代码块。 volatile 用volatile修饰的变量,线程在每次使用变量的时候,都会读取变量修改后的最的值。volatile很容易被误用,用来进行原子性操作。 下面看一个例子,我们实现一个计数器,每次线程启动的时候,会调用计数器inc方法,对计数器进行加一 执行环境——jdk版本:jdk1.6.0_31 ,内存 :3G cpu:x86 2.4G public class Counter { public static int count = 0; public static void inc() { //这里延迟1毫秒,使得结果明显 try { Thread

java多线程并发之synchonized

痞子三分冷 提交于 2020-03-03 16:56:59
1、Java实现多线程目的 Java中实现多线程 利计算机 多核cup并行 处理多个线程, 提升CUP的利用率,提升程序的处理速度。 当使用多线程进行并发编程时,当有共享资源时,就需要我们考虑线程安全问题。 如下图,假设改计算机有3个CUP,单对共享变量进行自增时。 cup在处理时,会将共享内存缓存到L1,L2,L3高速缓存中,当三个线程同时对i进行自增时,在缓存中拷贝的都是不可以预测,造成自增后的结果也是不可以预测,总是会小于或者等于3 public class ThreadDemo1 implements Runnable { private static int i=0; @Override public void run() { try { Thread.sleep(400); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } increment(); System.out.println("完成处理"); } public /*synchronized */void increment() { i++; } public static void main(String[] args) { ThreadDemo1 task=new

【多线程-LeetCode】 按序打印

南笙酒味 提交于 2020-03-03 15:53:03
我们提供了一个类: public class Foo { public void one() { print("one"); } public void two() { print("two"); } public void three() { print("three"); } } 三个不同的线程将会共用一个 Foo 实例。 线程 A 将会调用 one() 方法 线程 B 将会调用 two() 方法 线程 C 将会调用 three() 方法 请设计修改程序,以确保 two() 方法在 one() 方法之后被执行,three() 方法在 two() 方法之后被执行。 示例 1: 输入: [1,2,3] 输出: “onetwothree” 解释: 有三个线程会被异步启动。 输入 [1,2,3] 表示线程 A 将会调用 one() 方法,线程 B 将会调用 two() 方法,线程 C 将会调用 three() 方法。 正确的输出是 “onetwothree”。 示例 2: 输入: [1,3,2] 输出: “onetwothree” 解释: 输入 [1,3,2] 表示线程 A 将会调用 one() 方法,线程 B 将会调用 three() 方法,线程 C 将会调用 two() 方法。 正确的输出是 “onetwothree”。 注意: 尽管输入中的数字似乎暗示了顺序

多线程与并发编程

风格不统一 提交于 2020-03-03 15:14:15
单线程。 cpu核心的缓存只被一个线程访问。缓存独占,不会出现访问冲突等问题。 单核CPU,多线程。 进程中的多个线程会同时访问进程中的共享数据,CPU将某块内存加载到缓存后,不同线程在访问相同的物理地址的时候,都会映射到相同的缓存位置,这样即使发生线程的切换,缓存仍然不会失效。但由于任何时刻只能有一个线程在执行,因此不会出现缓存访问冲突。 多核CPU、多线程情况下存在缓存不一致的情况 每个核都至少有一个L1 缓存。多个线程访问进程中的某个共享内存,且这多个线程分别在不同的核心上执行,则每个核心都会在各自的caehe中保留一份共享内存的缓冲。由于多核是可以并行的,可能会出现多个线程同时写各自的缓存的情况,而各自的cache之间的数据就有可能不同。 在CPU和主存之间增加缓存,在多线程场景下就可能存在 缓存一致性问题 ,也就是说,在多核CPU中,每个核的自己的缓存中,关于同一个数据的缓存内容可能不一致。 理解为: 如果这家公司的命令都是串行下发的话,那么就没有任何问题。 如果这家公司的命令都是并行下发的话,并且这些命令都是由同一个CEO下发的,这种机制是也没有什么问题。因为他的命令执行者只有一套管理体系。 如果这家公司的命令都是并行下发的话,并且这些命令是由多个合伙人下发的,这就有问题了。因为每个合伙人只会把命令下达给自己直属的管理人员,而多个管理人员管理的底层员工可能是公用的。