在 Java 的线程安全是老生常谈的问题。经常是各种写法说法一大堆,感觉很多的来源都是在面试的时候,很多考官都喜欢问线程安全的问题。

起源

这个问题的起源就是 Java 是支持多线程的。如果对进程和线程是什么不太清楚的话,可以恶补下大学课程《操作系统》。

一般来说,JVM 是会以一个进程来运行,当进程启动后,会启动多个线程来提高 CPU 的利用率。

如果是多线程的话,那会在访问同一个变量,同一个代码的的时候出现数据不同步的情况。

简单来说对于一个变量 V,如果线程 TA 反问了,并且修改了,在这个时候,TB 线程也访问变量 V 也进行了修改。

在线程 TB 进行访问的和计算的时候,TB 不知道 TA 已经对 变量 V 进行了修改,会导致结果计算不准确。这是因为 TB 在拿到变量 V 的时候和 TA 在拿到变量 V 的时候的数据是不一样的。

这个就是线程安全的问题来源:线程同时访问了一个变量或者代码块。

思路

如果只是针对上面的思路的话,我们不定义全部变量 V 不就没有问题了。

事实上也是这样的,如果你定义的变量是线程内的变量,或者不可以修改的变量的话,是没有多线程的问题的。

因此考虑线程安全的问题,就是要考虑你定义的变量或者方法,在多个线程进行访问的和计算的时候会不会有不同的结果。

如果没有不同结果:线程安全。

有可能会得到不同的结果:线程不安全。

基于上面的说法,我们有多个办法可以参考下:

无状态实现( stateless implementations):没有使用全局变量,所有的变量都是方法内的变量。

不可变实现( Immutable Implementations):对象在创建后就不能被修改了。考察下 String 定义。

线程安全类(thread-safe classes):类中的所有变量都会在本线程中使用,这个变量是不会与其他线程共享的,例如: private final 的 List。

同步( Synchronized):方法或者类或状态的同步,也可实现线程安全。

锁(Lock):对锁的使用。

其实还有多种其他的方法来实现线程安全。

实际上在对 Java 的开发中,需要对线程安全的概念有所了解,并且知道查看 API 的时候需要了解会不会有线程安全的问题即可。

在实际的开发中,很多人就直接使用 Synchronized 关键字来实现方法的线程安全了。因为这个实现是最简单的。

可以看看 StringBuffer 的源代码也就会有所了解了。

java thread safe_Java 线程安全 Thread-Safety相关推荐

  1. java编程之线程,继承Thread类,匿名内部类的写法

    package ThreadTest; //java编程之线程,继承Thread类,匿名内部类的写法 public class Test3 {public static void main(Strin ...

  2. java 暂停当前线程_Java Thread.Sleep()暂停当前线程

    首页 > 基础教程 > 多线程 > Thread类 Java Thread.Sleep()暂停当前线程 Thread.sleep()被用来暂停当前线程的执行,会通知线程调度器把当前线 ...

  3. JavaSE基础二十:Java 多线程(线程基础知识、Java 多线程、Java 实现多线程(继承 Thread 类、实现 Runnable 接口、实现 Callable 接口))

    本章目录 1.基础知识准备 2.Java 多线程概述 3.Java 实现多线程 3.1.继承 Thread 类 如何开启新线程 Thread 类常用方法 多线程中的同步 Thread 类同步方法 多线 ...

  4. Thread创建线程

    创建线程 1.继承Thread类创建线程 public class MyThread extends Thread{public void run(){System.out.println(" ...

  5. 【Java 语言】Java 多线程 一 ( 线程基础 : 线程启动 | 线程停止 | 线程暂停 | 线程优先级 | 守护线程)

    一. 线程启动 线程启动 : -- 1. 继承 Thread 运行线程 : 重写 Thread 类的 run 方法, 然后执行该线程; -- 2. 实现 Runnable 接口, 并运行线程; -- ...

  6. JAVA中创建线程的三种方法及比较

    JAVA中创建线程的方式有三种,各有优缺点,具体如下: 目录 一.继承Thread类来创建线程 二.实现Runnable接口来创建线程 三.通过Callable和Future来创建线程 四.三种方式创 ...

  7. java中创建线程的四种方式及线程池详解

    众所周知,我们在创建线程时有四种方法可以用,分别是: 1.继承Thread类创建线程 2.实现Runnable接口创建线程 3.使用Callable和Future创建线程 4.使用线程池创建(使用ja ...

  8. Java获取当前线程的名字以及为线程命名

    为线程命名可以再构造方法中传入线程的名字,也可以在调用set方法来赋予名字 public class ThreadDemo {public static void main(String[] args ...

  9. 【Java线程】Thread Runnable必知必会

    1.Java中线程的创建有两种方式: 通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中; 通过实现Runnable接口,实例化Thread类; (1).继承Threa ...

最新文章

  1. 实战:使用 OpenCV 的自动驾驶汽车车道检测(附代码)
  2. SQL点滴22—性能优化没有那么神秘
  3. Rabbits —— HDU-6227
  4. 面试pythone_python面试常见问题有哪些
  5. mongodb java数组_MongoDB 基础java数据类型
  6. mysql-外键操作-级联删除
  7. ERROR1045(28000): AccessforuserODBC‘@‘ (using password: YES)
  8. python 面试相关
  9. 【bzoj2834】回家的路 分层图最短路
  10. MySQL 第六次练习(视图)
  11. 前端怎么做接口签名验证 -baijiahao_阿里一面:如何保证API接口数据安全?
  12. unix系列系统镜像下载
  13. xml转json的两种方法
  14. 惠普m227fdw引擎通信错误_惠普打印机HPM227提示耗材余量错误怎么办?
  15. 【年终总结】—此生平凡,终不简单
  16. 计算机的数字音乐,论数字音乐作曲
  17. 理解ASP.NET Core - 发送Http请求(HttpClient)
  18. 实时网速监测app_实时网速-实时网速app安卓版下载v1.0-我爱秘籍
  19. 计算机的简史:从数字运算到强大的现代机器
  20. 6-2对象作为数据成员

热门文章

  1. VS Code 批量操作
  2. 来来来!一次搞定各种数据库 SQL 执行计划:MySQL、Oracle
  3. 使用FTP下载文件connect.retrieveFileStream(filename) 获取不到InputStream流,返回null的问题
  4. tomcat9 启动中提示 org.apache.catalina.webresources.Cache.getResource Unable to add t
  5. IntelliJ IDEA 2019 安装lombok
  6. 英雄联盟祖安服务器要维护多久,祖安玩家的春天!英雄联盟将回归队内语音,娱乐玩家遭殃了?...
  7. python定期自动运行_干货分享 | 适合 Python 入门的 8 款强大工具,不会就你还不知道吧!...
  8. C语言 指针声明和定义 - C语言零基础入门教程
  9. form表单图片预览 layui_layui 实现图片上传和预览
  10. 计算机网络技术俄罗斯方块,《The Tetris Effect》:这本新书讲述了俄罗斯方块的传奇故事...