千家信息网

java线程安全Synchronized关键字怎么使用

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,这篇文章主要介绍"java线程安全Synchronized关键字怎么使用",在日常操作中,相信很多人在java线程安全Synchronized关键字怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简
千家信息网最后更新 2026年10月31日java线程安全Synchronized关键字怎么使用

这篇文章主要介绍"java线程安全Synchronized关键字怎么使用",在日常操作中,相信很多人在java线程安全Synchronized关键字怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"java线程安全Synchronized关键字怎么使用"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

1 多线程下为什么会存在线程安全问题

线程的合理使用能够提升程序的处理性能,一是能够利用多核 CPU 来实现线程的并行执行,二是线程的异步化执行能够提高系统的吞吐量。

虽然线程有这些优点,但同时也带来了很多问题。比如说:

1.1 共享变量带来的安全性问题

先来看个图:

一个变量 i ,如果线程 A 或者线程 B 单独访问并且修改变量 i 的值没有任何问题,那如果并行的修改变量 i ,那就会有安全性问题。

然后用代码来模拟一下这种场景,为了更好的看到效果,我用100个线程:

public class ThreadDemo1 {      private static int i = 0;      public static void inc() {         try {             Thread.sleep(1);         } catch (InterruptedException e) {             e.printStackTrace();         }         i++;     }      public static void main(String[] args) throws InterruptedException {         for (int i = 0; i < 100; i++) {             new Thread(() -> ThreadDemo1.inc()).start();         }         Thread.sleep(1000);         System.out.println("运行结果" + i);     } }

输出结果:

88

这个输出结果是不固定的,第一次可能是 88 ,第二次可能是 87 ,这个结果就和我们预期的结果不一致(预期结果是100),所以一个对象是否是线程安全的,取决于它是否会被多个线程访问,以及程序中是如何去使用这个对象的。如果 多个线程访问同一个共享对象,在不需额外的同步以及调用端代码不用做其他协调的情况下,这个共享对象的状态 依然是正确的(正确性意味着这个对象的结果与我们预期 规定的结果保持一致),那说明这个对象是线程安全的。

对于线程安全性,本质上是管理对于数据状态的访问,而且这个这个状态通常是共享的、可变的。共享:是指这个 数据变量可以被多个线程访问;可变:指这个变量的值在 它的生命周期内是可以改变的。

2.如何保证线程并行的数据安全性-Synchroinzed

针对上面那种情况,我们该如何解决这种问题呢?首先想到的就是加锁,并且这种锁必须是互斥的。比如上面的图片的例子,如果线程A在修改 i 的值时,线程 B 就不能去修改 i 的值。也就是说并行去修改共享变量的值会有线程安全性问题,那么我们不让你并行,不就解决了这个问题嘛。所以java提供了 Synchroinzed 关键字。

2.1 Synchroinzed 的基本认识

Synchroinzed 很早就有了,只是之前是重量级锁,所以很好有人使用。在 javaSE 1.6 对Synchroinzed进行了优化引入了偏向锁和轻量级锁。所以在并发量不高的情况还是推荐使用 Synchroinzed 来加锁。为什么是并发量不高的情况推荐使用,因为并发量高的情况 Synchroinzed 会升级为重量级锁。

2.2 Synchroinzed 的三种加锁方式

  1. 修饰实例方法,锁是当前实例对象 ,进入同步代码前要获得当前实例的锁

  2. 修饰静态方法,锁是当前类的class对象 ,进入同步代码前要获得当前类对象的锁

  3. 修饰代码块,锁是括号里面的对象,对给定对象加锁,进入同步代码库前要获得给定对象的锁。

  4. 加q群:478052716 免费领取(Java架构资料,视频资料,BATJ面试资料)

看下简单的代码

public class SynchroinzedDemo {      /**      * 对静态方法加锁      */     public static synchronized void test(){}     /**      * 对实例方法加锁      */     public synchronized void test1(){}     /**      * 对代码块加锁      */     public void test2(){         synchronized(this){}     } }

然后我们将上面的例子实现 synchronized 加锁:

public class ThreadDemo1 {      private static int i = 0;      public static void inc() {         synchronized (ThreadDemo1.class){             try {                 Thread.sleep(1);             } catch (InterruptedException e) {                 e.printStackTrace();             }             i++;         }     }      public static void main(String[] args) throws InterruptedException {         for (int i = 0; i < 100; i++) {             new Thread(() -> ThreadDemo1.inc()).start();         }         Thread.sleep(1000);         System.out.println("运行结果" + i);     } }

运行结果:

运行结果100

完美的解决共享变量并行修改带来的线程安全问题。

到此,关于"java线程安全Synchronized关键字怎么使用"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

线程 安全 对象 结果 问题 代码 变量 关键 关键字 安全性 情况 方法 实例 资料 同步 学习 运行 多个 数据 状态 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技公司的优势 科技互联网政务服务 金融科技创新监管互联网金融 没上市的科技互联网公司 互联网的科技创新 易互联网科技有限公司 南京欣网互联网科技 睿民互联网科技 长亮科技 互联网金融 广西拼得多互联网科技有限公司 济南和联互联网科技有限公司 成都玖崟互联网科技有限公司乐商圈怎么样 明优互联网科技有限公司 美国互联网科技公司 南京一网一红互联网科技有限公司 国产互联网科技公司 上海万顺科技互联网有限公司招聘 科技互联网专业工作会议发言稿 山东蛋芒互联网科技有限公司 利用互联网等科技手段 宜安科技 互联网金融 奇士达互联网科技 互联网科技素材视频竖屏 南山科技园互联网公司有哪些 宁夏科技产业互联网案例 洛阳共同富裕互联网科技有限公司 互联网数据科技专业 郑州欣桑互联网科技有限公司 萌小萌互联网科技河南有限公司 广州智享互联网科技
0