news 2026/6/11 14:23:38

线程的生命周期之线程同步

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
线程的生命周期之线程同步

如你所知,当使用多个线程访问同一个数据时,如果没有同步机制,很容易出现线程安全问题,可能会导致数据不一致,甚至会出现死锁的情况。因此,线程同步是保证程序正确性和性能的重要手段。

可以在程序中加入同步代码块使线程同步,同步代码块的语法格式如下:

synchronized(obj) { ... //此处的代码就是同步代码块 }

这里是一个简单的 Java 多线程代码段,使用同步块来确保线程安全:

public class SynchronizedThread implements Runnable { private int count; public void run() { synchronized (this) { for (int i = 0; i < 5; i++) { System.out.println(Thread.currentThread().getName() + ": " + count); count++; try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } } } public static void main(String[] args) { SynchronizedThread synchronizedThread = new SynchronizedThread(); Thread thread1 = new Thread(synchronizedThread); Thread thread2 = new Thread(synchronizedThread); thread1.start(); thread2.start(); } }

在这个例子中,我们创建了一个名为 SynchronizedThread 的类,它实现了 Runnable 接口,并覆盖了 run() 方法。在 run() 方法中,我们使用同步块来确保线程安全。synchronized 关键字将代码块标记为同步,并使用 this 作为互斥锁对象。

我们还创建了两个线程 thread1 和 thread2 ,它们共享同一个 SynchronizedThread 实例,并同时运行。由于我们使用了同步块,这两个线程在访问共享变量 count 时不会发生竞争条件。

Java 多线程安全还可以使用同步方法,同步方法就是使用 synchronized 关键字来修饰某个方法,则该方法为同步方法,通过使用同步方法可以使该方法被多个线程安全地访问。

以下是一个使用同步方法的例子:

public class SynchronizedExample { private int count = 0; public synchronized void increment() { count++; } public synchronized int getCount() { return count; } public static void main(String[] args) { SynchronizedExample example = new SynchronizedExample(); // create multiple threads Thread thread1 = new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < 1000; i++) { example.increment(); } } }); Thread thread2 = new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < 1000; i++) { example.increment(); } } }); // start the threads thread1.start(); thread2.start(); // wait for the threads to finish try { thread1.join(); thread2.join(); } catch (InterruptedException e) { e.printStackTrace(); } // print the final count System.out.println("Final count: " + example.getCount()); } }

这个例子中,我们定义了一个类 SynchronizedExample ,其中有一个计数器 count 。我们使用 synchronized 关键字来定义了两个同步方法 increment() 和 getCount() ,以确保多个线程不能同时访问这两个方法。

在 main() 方法中,我们创建了两个线程,并分别启动它们。每个线程都会执行 1000 次 increment() 方法,以增加计数器的值。

最后,我们等待这两个线程完成,然后打印最终的计数器值。由于这两个线程是同步执行的,所以最终的计数器值应该是 2000 。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/11 14:23:37

LXMusic音源:5分钟打造你的全网音乐自由听歌方案

LXMusic音源&#xff1a;5分钟打造你的全网音乐自由听歌方案 【免费下载链接】LXMusic音源 lxmusic&#xff08;洛雪音乐&#xff09;全网最新最全音源 项目地址: https://gitcode.com/guoyue2010/lxmusic- 还在为不同音乐平台切换而烦恼吗&#xff1f;想在一个软件里畅…

作者头像 李华
网站建设 2026/6/11 14:23:37

有向图的欧拉回路与欧拉路径

我们也可以在有向图中寻找欧拉回路与欧拉路径。与无向图中类似&#xff0c;我们只要抓住进入每个点和离开每个点的边数关系&#xff0c;就能得到有向图中存在欧拉回路或欧拉路径的判定条件。对于欧拉回路&#xff0c;进入每个点和离开每个点的边数是一样的&#xff0c;因此有向…

作者头像 李华
网站建设 2026/6/11 14:23:36

CUDA版本兼容性挑战与bitsandbytes量化优化方案

CUDA版本兼容性挑战与bitsandbytes量化优化方案 【免费下载链接】bitsandbytes Accessible large language models via k-bit quantization for PyTorch. 项目地址: https://gitcode.com/gh_mirrors/bi/bitsandbytes 技术场景与价值主张 在大规模语言模型训练与推理的实…

作者头像 李华
网站建设 2026/6/11 14:22:06

PCA9698 GPIO扩展芯片深度解析:40位I2C端口扩展器在嵌入式系统中的应用

1. 项目概述与核心价值在嵌入式开发和工业控制项目中&#xff0c;我们常常会遇到一个经典难题&#xff1a;主控芯片的GPIO引脚不够用了。无论是驱动几十个LED指示灯、读取多路传感器状态&#xff0c;还是控制一组继电器阵列&#xff0c;当项目规模稍微扩大&#xff0c;微控制器…

作者头像 李华
网站建设 2026/6/11 14:21:21

Python+OpenCV+PyAutoGUI:构建高精度自动化图形界面操作脚本

1. 为什么需要OpenCVPyAutoGUI组合&#xff1f; 很多朋友第一次接触桌面自动化时&#xff0c;都会直接用PyAutoGUI的locateOnScreen()功能。这个函数确实方便&#xff0c;但实际用起来就会发现几个痛点&#xff1a;识别速度慢、对图片尺寸敏感、背景变化时容易失效。我在做一个…

作者头像 李华