文章目录

  • 六、进程和线程有什么区别?
  • 七、java当中如何实现线程呢?
    • (1)继承Thread
    • (2)实现Runnable
  • 八、说说线程的生命周期
  • 九、多线程并发或线程安全问题如何解决?
  • 十、synchronized和ReentrantLock的区别

六、进程和线程有什么区别?

根本区别:进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位

在开销方面:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小。

所处环境:在操作系统中能同时运行多个进程(程序);而在同一个进程(程序)中有多个线程同时执行(通过CPU调度,在每个时间片中只有一个线程执行)

内存分配方面:系统在运行的时候会为每个进程分配不同的内存空间;而对线程而言,除了CPU外,系统不会为线程分配内存(线程所使用的资源来自其所属进程的资源),线程组之间只能共享资源。

包含关系:没有线程的进程可以看做是单线程的,如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。

七、java当中如何实现线程呢?

(1)继承Thread

MyThread.java

public class MyThread extends Thread{public void run(){//run方法就是线程要执行任务的方法//这是执行路径 触发方式不是调run而是用start()启动系统for(int i=0;i<10;i++){System.out.printIn("m线程"+i);}}
}

Demo.java

public class Demo{//多线程技术 抢占public static void main(String[] args){MyThread m=new MyThread();//启动m线程m.start();for(int i=0;i<10;i++){System.out.printIn("main'线程");}}
}

程序启动 → main线程开启 → main方法执行 → 创建m对象 →
1.m线程开启 循环十次
2.main本身循环十次

(2)实现Runnable

用于给线程执行任务

MyRunnable.java

public class MyRunnable implements Runnable{//线程的任务public void run(){for(int i=0;i<10;i++){System.out.prinIn("m线程");}}
}

Demo.java

public class Demo{public static void main(String[] args){//1.实现Runnable 创建一个任务对象MyRunnable r=new MyRunnable();//2.创建一个线程并分配任务Thread t=new Thread(r);//3.执行这个线程t.start();for(int i=0;i<10;i++){System.out.printIn("主线程");}}
}

程序启动 → main线程开启 → main方法执行 → 创建m对象 →
1.m线程开启 循环十次
2.main本身循环十次

实现Runnable和继承Thread相比优势
(1)通过创建任务给线程分配的方式,适合多线程同时执行情况。
(2)避免单继承局限。
(3)任务与线程分离提高程序健壮性。
(4)线程池技术仅授权Runnable型任务,不接收Thread型。

八、说说线程的生命周期


九、多线程并发或线程安全问题如何解决?

1:通过volatile 关键字修饰变量,可以实现线程之间的可见性,避免变量脏读的出现,底层是通过限制jvm指令的重排序来实现的适用于一个线程修改,多个线程读的场景

2:通过synchronized锁(任意对象)来实现线程同步,自动锁的思想,底层实现原理:当有线程进入同步代码块之后,利用jvm的计数器将锁的标记置为1,当别的线程再想进入的时候,发现锁的标记为1,该线程就去锁池等待,当第一个线程出来之后,锁的标记会置为0,之后cpu会随机分配一个线程再次进入同步代码块.

3:通过lock锁的机制,进行手动lock,和unlock,但是这种很容易出现死锁。注意加锁以及解锁的顺序,就可以避免死锁

4:通过线程安全的集合类,可以解决并发问题:
ConcurrentHashMap
CopyonWriteArrayList

5:使用并发包下面的原子类,底层使用的是cas机制(乐观锁),可以解决并发问题 atomicInteger 线程安全的原子整型类

6:使用线程池来创建和管理线程,也可以一定程度上解决并发问题

7:使用ThreadLocal来修饰变量,可以解决并发问题

ThreadLocal底层是怎么实现的?
多个线程会复制一份threadLocao变量的副本进行操作,互不影响,来保证线程安全的

十、synchronized和ReentrantLock的区别

synchronized 是 Java 中的关键字,而ReentrantLock是一个类,继承自父类Lock

ReentrantLock更加灵活,提供了超时获取锁,可中断锁。提供了公平锁和非公平锁,而synchronized仅仅是非公平锁。

用法上,ReentrantLock必须手动释放锁,并且只能修饰代码块。而synchronized不用手动释放锁,除此之外可以修饰方法。

JAVA技术方向面试题-核心类库(下)相关推荐

  1. JAVA 技术方向面试题OOP

    JAVA 技术方向面试题OOP 1.说说你对面向对象思想的理解? 面向对象是一种编程思想,是相对于面向过程的概念而言的. 面向对象强调把数据和方法组织成一个整体来看待,将世间万物抽象成一个个对象来对待 ...

  2. java技术面试之面试题大全

    转载自:http://blog.csdn.net/lijizhi19950123/article/details/77679489 Java 面试知识点总结 本篇文章会对面试中常遇到的Java技术点进 ...

  3. 2021腾讯社招java技术岗面试题

    目录 一.背景 二.一面面试题 三.二面面试题 四.总结 五.参考资料 一.背景 最近面试了腾讯技术岗,一面和二面问了一些问题,下面给大家分享一下,有些题目是我根据自己的情况回答的,可以参考一下,小伙 ...

  4. 【Java进阶营】Java技术专题「难点-核心-遗漏」Java线程状态流转及生命周期的技术指南(知识点串烧)

    前提介绍 本章主要介绍相关线程声明周期的转换机制以及声明周期的流转关系以及相关AQS的实现和相关的基本原理,配合这相关官方文档的中英文互译的介绍. 线程状态流转及生命周期 当线程被创建并启动以后,它既 ...

  5. JAVA 技术方向赏金任务-快递 E 栈训练任务

    用数组实现以下截图功能,作为用户或者快递员实现快递存储和拿取功能 代码如下: import java.util.Scanner;public class Delivery {//默认存储1000条记录 ...

  6. Java技术分享:集群环境下的定时任务

    定时任务的实现方式有多种,例如JDK自带的Timer+TimerTask方式,Spring 3.0以后的调度任务(Scheduled Task),Quartz框架等. Timer+TimerTask是 ...

  7. java 图片的路径_【JAVA技术】如何展现绝对路径下的图片

    问题描述:通常情况下,我们在jsp页面上要想显示图片,直接用html的标签即可,但是img标签的src属性的值为图片存放的相对地址.如果图片文件没有存放在整个工程中,此时就需要访问图片文件的绝对路径, ...

  8. JAVA 技术方向支线任务-找到休息日

    任务目标: 业务目标:让孙工找到当月休息日 技能目标:综合运用循环判断分支结构,对程序进行格式化输出 某公司软件开发工程师孙工,作息规律为上三天班,休息一天,经常不确定休 息日是否周末,为此,请你开发 ...

  9. Java笔记:Java SE —— 核心类库(下)

    数据来源:拉勾教育Java就业急训营 核心类库(下) 一. 异常机制和File类 1. 异常机制(重点) 1.1 概念 1.2 异常的分类 1.3 异常的避免 1.4 异常的捕获 笔试考点 1.5 异 ...

最新文章

  1. Pytorch Lightning 完全攻略!
  2. 如何利用css使PNG图片透明
  3. 如何比较 Java 的字符串
  4. C/C++之内存对齐
  5. 如何延长作用域链_通过实例理解javaScript中的this到底是什么和它的词法作用域...
  6. HiveQL中如何排查数据倾斜问题
  7. (42)System Verilog接口变量数据位宽扩展
  8. android viewflipper图片轮播,android开发:ViewFlipper实现图片轮播
  9. python第八十八天----dom js
  10. excel多列多行堆叠成多列一行_如何将多行多列数据转置成列-Excel中如何将多行多列数据转置成列...
  11. 【计算机网络学习笔记13】交换技术(下)
  12. jspdf添加宋体_JSPDF支持中文(思源黑体)采坑之旅,JSPDF中文字体乱码解决方案...
  13. Linux中命令行查找文件
  14. 写计算机知识大全的结尾怎么写,写事作文开头结尾大全
  15. 遗传算法:交叉算子的分类
  16. 甘特图,看这篇就够了
  17. linux常规实战(三)简单的samba共享实现
  18. 【游戏编程扯淡精粹】调试方法论
  19. Shell编程三剑客之awk
  20. tinder的定位在哪_我重新设计了Tinder。 这是我在此过程中学到的。

热门文章

  1. 最新QT从入门到实战完整版(08.qt中的坐标系-09 信号和槽-点击按钮关闭窗口_)
  2. macOS系统偏好设置中,软件更新,提示无法检查更新,请确定您已接入互联网
  3. 茅台集团48岁总工程师成中国工程院院士候选人引争议!“白酒院士”会成真吗?...
  4. XNA游戏:手势触控
  5. 《Real Time Rendering》第四章 图形变换
  6. Android笔记-Linux Kernel Ftrace (Function Trace)解析
  7. ITeye,还IT淫一个简洁的首页吧!
  8. android 高颜值app开发第一步——颜色与渐变
  9. android系统坏掉了怎么办,手机系统坏了怎么修复
  10. Avoid mutating a prop directly since the value will be overwritten报错问题解决方案