首页 > 编程语言 >Java学习笔记(十六)

Java学习笔记(十六)

时间:2023-06-26 09:11:32浏览次数:39  
标签:Java synchronized 十六 笔记 关键字 线程 接口 进程 多线程

1.什么是线程?

线程是指操作系统中的一种执行单元,它是进程中的一部分,可以看作是轻量级的进程。与进程不同的是,线程共享同一进程的地址空间和系统资源,如打开文件和信号处理等,但每个线程都有自己的程序计数器(PC)和栈,用于执行代码和存储局部变量等数据。

2。线程和进程有什么区别?

线程和进程都是操作系统中的执行单元,但它们有以下区别:

(1)资源占用:进程是系统中分配资源的基本单位,每个进程都有自己独立的内存空间、文件句柄、网络连接等系统资源,它们之间相互独立。而线程是进程中的一个执行单元,它与同一进程中的其他线程共享同一内存空间和系统资源,包括文件句柄、网络连接、进程上下文等,因此线程之间的通信和切换比进程更快,且线程占用的资源更少。

(2)调度和切换:操作系统调度进程和线程的方式不同。进程调度和切换需要保存和恢复进程的上下文,包括CPU寄存器、内存状态、打开文件和网络连接等信息,因此进程切换的开销较大。而线程切换只需要保存和恢复线程自己的上下文,因此线程切换的开销较小。

(3)安全性:线程之间共享同一内存空间,因此在多线程编程中需要考虑线程安全问题,例如多个线程同时访问同一变量时可能会出现数据竞争的情况。而进程之间相互独立,可以通过进程间通信(IPC)来进行数据传输和协作。

(4)创建和销毁:创建新进程的开销比创建新线程的开销大,因为新进程需要复制父进程的全部资源和状态。销毁进程时需要回收系统资源和清理进程状态,也比销毁线程的开销大。

 

3.线程使用场景?

         线程通常用于编写多任务和并发程序,

4.如何在Java中出实现多线程?

继承Thread类、实现Runnable接口

5.Thread类中的start()和run()有什么区别?

start()方法用于启动一个新线程,在新线程中异步执行run()方法中的代码;而run()方法是线程的执行体,包含了线程要执行的代码,但它不会启动一个新线程,而是在当前线程中同步执行。

6.启动一个线程是用run()还是start()?

start()

7.Java中Runnable和Callable有什么不同?

  1. 返回值:Runnable接口的run()方法没有返回值,而Callable接口的call()方法可以返回一个结果,该结果可以通过Future对象获取。
  2. 异常处理:Runnable接口的run()方法不能抛出异常,而Callable接口的call()方法可以抛出异常,需要通过try-catch语句进行处理。
  3. 使用方式:Runnable接口通常用于编写简单的线程任务,而Callable接口通常用于编写复杂的、需要返回结果的线程任务。
  4. 返回值类型:Callable接口的call()方法返回值类型可以通过泛型进行指定,而Runnable接口没有返回值类型。

 

8.你如何理解线程安全的?线程安全问题是如何造成的?

(1)线程安全是指在多线程环境下,对共享资源的访问不会出现数据的不一致、丢失或重复等问题。线程安全的代码可以在多个线程中并发执行,而不会产生意外的结果或错误。

(2)线程安全问题通常由多个线程同时访问共享资源而引起的。

 9.多线程共用一个数据变量需要注意什么?

(1)线程安全:多个线程同时访问同一变量时,可能会出现数据竞争的情况。为了避免数据竞争,需要使用同步机制(如synchronized关键字、Lock接口等)来保证线程安全。

(2)可见性:当一个线程修改了变量的值时,其他线程可能无法立即看到变化。为了保证可见性,可以使用volatile关键字,保证对变量的读写操作是立即可见的。

(3)原子性:某些操作可能需要多个步骤才能完成,如果在多线程环境下没有采取同步机制,可能会导致部分步骤被其他线程插入,从而导致意外的结果。为了保证原子性,可以使用原子操作类(如AtomicInteger、AtomicLong等)。

(4)有序性:多个线程同时访问同一变量时,可能会出现读写顺序混乱的情况。为了保证有序性,可以使用同步机制或者volatile关键字来保证变量的读写顺序。

(5)上下文切换:当多个线程同时访问同一变量时,会出现上下文切换的情况,从而影响程序的性能。为了避免上下文切换,可以使用分离锁、非阻塞算法等技术,减少线程之间的竞争。

10. 多线程保证线程安全一般有几种方式?

        同步机制

11. 用什么关键字修饰同步方法?

synchronized

12.synchronized加在静态方法和普通方法区别?

当synchronized关键字加在静态方法上时,它会锁定该方法所属的类。

当synchronized关键字加在普通方法上时,它会锁定该方法所属的对象。

13.Java中synchronized和ReentrantLock有什么不同?

(1)锁的获取方式:synchronized关键字是隐式锁(内置锁),它可以自动获取和释放锁。而ReentrantLock是显式锁,需要手动获取和释放锁。

(2)锁的可重入性:synchronized是可重入锁,同一个线程可以多次获取同一个锁。而ReentrantLock也是可重入锁,但需要手动释放锁。

(3)锁的公平性:synchronized关键字是非公平锁,无法保证线程获取锁的顺序。而ReentrantLock可以是公平锁和非公平锁,可以通过构造函数指定锁的公平性。

(4)条件变量:ReentrantLock提供了Condition接口,可以使用Condition实现更灵活的线程等待/通知机制。而synchronized关键字没有提供类似的机制。

(5)性能:synchronized是JVM内置的关键字,是Java语言层面的同步机制,因此具有更高的执行效率和更好的可移植性。而ReentrantLock是基于JUC(java.util.concurrent)框架实现的,它提供了更多的高级特性和灵活性,但会带来一定的性能开销。

14.当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?

不可,锁被占用。

标签:Java,synchronized,十六,笔记,关键字,线程,接口,进程,多线程
From: https://www.cnblogs.com/wgh123/p/17504461.html

相关文章

  • 人生观察语料学习笔记133
    标题記憶喪失の人を騙し続けたら?如果一直欺骗一个失去记忆的人会怎么样呢?きおく(記憶)【名】记忆そうしつ(喪失)【名】丧失ひと(人)【名】人だます(騙す)【他动词・五段/一类】欺骗つづく(続く)【自动词・五段/一类】继续つづ......
  • 李超线段树 学习笔记
    李超线段树学习笔记今天模拟赛用到了李超线段树(但是本蒟蒻费了半天劲搞了个斜率优化拿到了60pts的好成绩/kk),所以学习一下李超线段树刻不容缓(学会了我貌似也切不来那道题qwq)。引入初中和高中我们都做过函数题吧,是不是有时候给你两根甚至几根直线,然后问你某个点的最值?当然,......
  • 「学习笔记」vector
    本文并不是vector的入门教程。定义std::vector是封装动态数组的顺序容器。vector通常占用多于静态数组的空间,因为要分配更多内存以管理将来的增长。如果元素数量已知,可以使用reserve()函数提前分配内存。操作函数由于vector大家比较熟悉了,这里给大家带来一些其他......
  • JAVA方法
    java方法原子性​​publicstaticintmax(intnum1,intnum2){  intresult=0;//初始化  if(num1==num2){    System.out.println("num1==num2");    return0;//终止方法 }  if(num1>num2){    result=num1; }else{   ......
  • C语言学习笔记
    斐波那契定义:斐波那契数列是一个数列,其中每个数字是前两个数字之和,起始于0和1。数列的定义如下:F(0)=0F(1)=1F(n)=F(n-1)+F(n-2)(对于n>1)换句话说,斐波那契数列的第n个数字是前两个数字之和,而前两个数字分别是0和1。数列的前几个数字如下所示:0,1,1,......
  • celery笔记七之周期/定时任务及crontab定义
    本文首发于公众号:Hunter后端原文链接:celery笔记七之周期/定时任务及crontab定义periodictask,即为周期,或者定时任务,比如说每天晚上零点零分需要运行一遍某个函数,或者每隔半小时运行一遍该函数,都是这种任务的范畴。在第一篇笔记的时候我们就介绍过celery的组件构成,其中有一......
  • 6月25日java学习日记
    端午节小休息了几天,断开连接了几天,希望快速状态回到吧,今天了解了部分java异常类,Exceptions类为异常类,学习了throw关键字,以及了解了trycatch的用法(基本与C#相同),同时使用HasgMap以及List.of方法实现了斗地主案例。 ......
  • 烧写文件系统——韦东山嵌入式Linux学习笔记11
    原文:https://blog.csdn.net/longintchar/article/details/71319513本文实验环境:1.windows7(64bit)2.JZ2440(V2)使用u-boot烧写文件系统,一般有两种方法。1.通过USB下载功能2.通过TFTP功能通过USB下载功能烧写文件系统这种方法比较简单。操作步骤:(1)连接板子和PC(串口+USB)(2)进入u-......
  • 学习Java前的一些介绍
    1.java开发环境搭建卸载:删除Java的安装目录删除JAVA_HOME删除path下关于java的目录java-version验证安装:创建jdk和jre两个目录(还可以创建一个code目录存放代码)百度搜索jdk(建议安装jdk8)同意协议,找到对应版本并且下载双击安装jdk配置环境变量我......
  • springboot中自定义JavaBean返回的json对象属性名称大写变小写问题
    目录一、继承类二、手动添加Get方法三、@JsonProperty四、spring-bootjson(jackson)属性命名策略开发过程中发现查询返回的数据出现自定义的JavaBean的属性值大小写格式出现问题,导致前端无法接受到数据,目前有四种解决方法,根据大佬的经验之谈,前两种是最简单便捷的,后两种是比较通......