赞
踩
参考面经:腾讯|客户端开发|面经(21 届秋招)|2021|
进程:操作系统资源分配的基本单位;
线程:调度的基本单位;
八种。信号、信号量、消息队列、无名管道、有名管道、高级管道、共享内存、套接字
参考链接:java多线程的6种实现方式详解
多线程的实现方式主要有两种:继承Thread类、实现Runnable接口
继承Thread类: 通过JDK提供的Thread类,重写Thread类的run方法即可,那么当线程启动的时候,就会执行run方法体的内容。
步骤:创建多个线程,指定线程名称
实现Runnable接口: 用接口的方式可以让我们的程序降低耦合度。Runnable接口中仅仅定义了一个方法,就是run。
步骤:创建线程任务,创建可运行类,lambda方式创建线程任务
使用内部类的方式:通过匿名内部类的方式,
定时器:JDK提供了Timer类来帮助开发者创建定时任务,另外也有很多的第三方框架提供了对定时任务的支持,比如Spring的schedule以及著名的quartz等等。
基于线程池:
1、synchronized关键字,就是用来控制线程同步的。(synchronized锁的是括号里的对象,而不是代码,其次,对于非静态的synchronized方法,锁的是对象本身也就是this)
2、lock;lock是在java1.6被引入进来的,lock引入让锁有了可操作性,需要手动的获取锁和释放锁,甚至可以中断获取以及超时获取的同步特性。
线程安全的两个方面:执行控制和内存可见。
执行控制的目的是:控制代码执行(顺序)及是否可以并发执行;
内存可见控制的是:线程执行结果在内存中对其他线程的可见性。
volatile: 是类型修饰符,用来修饰被不同线程访问和修改的变量,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。
原理:当对volatile标记的变量进行修改时,会将其他缓存中存储的修改前变量进行清除,然后重新读取。
synchronized: 可以用来给对象和方法或者代码块加锁,当锁定一个方法或者一个代码块时,同一时刻最多只能有一个线程执行这段代码。当两个并发线程访问同一个对象中的加锁同步代码块时,一个时间内只能有一个线程得到执行。
两者的区别:
1、volatile本质上是在告诉jvm,当前变量在寄存器中的值是不确定的,需要从主存中读取;而Synchronized是直接锁定,只能当前线程进行访问,其他线程阻塞。
2、使用范围: volatile只能使用在变量级别,而synchronized可以使用在变量、方法和类。
3、原子性: volatile只能实现变量的修改可见性,而synchronized可以保证变量的修改可见性和原子性;
4、线程阻塞: volatile不会造成线程的阻塞,而syn可能会造成线程的阻塞;
(就相当于:volatile告知高速上的汽车,当前行驶的路径在修路,让他切换路径;而syn是一辆一辆等着路修好再过)
5、编译器优化: volatile标记的变量不会被编译器优化;synchronized标记的变量可以被编译器优化
5、当一个域的值依赖于它之前的值时,volatile就无法工作了,
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。