Java面试之线程安全

79 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第28天,点击查看活动详情
前一段时间在浏览关于Java秋招一类的面试题,发现一道题考的是关于线程安全的,所以写一篇博客来记录并复习一下关于线程的知识。
首先介绍一下什么是线程
在Java中,线程与进程相似,但线程是⼀个⽐进程更⼩的执⾏单位。⼀个进程在其执⾏的过程中可以产⽣多 个线程。同类的多个线程共享进程的资源,但每个线程有⾃⼰的程序、计数器、虚拟机栈和本地⽅法栈,所以系统在产⽣⼀个线程,或是在各个线程之间作切换⼯作 时,负担要⽐进程⼩得多,也正因为如此,线程也被称为轻量级进程。如下图所示

Snipaste_2022-12-21_19-18-34.jpg 在Java中构造线程的两种办法:
第一种:继承Thread类创建线程

//1.创建一个继承于Thread类的子类
class MyThread extends Thread {
    //2.重写Thread类的run()
    @Override
    public void run() {
 
                System.out.println("我开起了一个线程");

        }
    }
}

第二种:通过实现Runnable接口创建线程

//1.创建一个实现了Runnable接口的类
class MThread implements Runnable {

    //2.实现类去实现Runnable中的抽象方法:run()
    @Override
    public void run() {
 System.out.println("我开起了一个线程");
    }
}

下面小编介绍一个面试题
题目描述:以下哪个不能用来处理线程安全
A:synchronized关键词 B:volatile关键词 C:Lock类 D:transient关键词
解释:

  • synchrozied关键字称作同步,主要用来给方法、代码块加锁,被加锁的代码段,同一时间内多线程同时访问同一对象的加锁方法/代码块时,只能有一个线程执行能执行方法/代码块中的代码,其余线程必须等待当前线程执行完以后才执行该方法/代码块。
  • volatile关键字1.保证了不同线程对该变量操作的内存可见性.(当一个线程修改了变量,其他使用次变量的线程可以立即知道这一修改)。2.禁止了指令重排序.
  • Lock接口提供了与synchronized关键字类似的同步功能,但需要在使用时手动获取锁和释放锁。
  • transient关键字 简单地说,就是让某些被修饰的成员属性变量不被序列化。