线程同步

【制作100个unity游戏之22】3DRPG游戏开发01——项目的设置和导入及渲染管线的安装修复 如果你现在存在一些疑惑unity导入素材为什么是粉紫色的?表示他没有适配我们的URP通用渲染管线,要如何适配呢?素材渲染错误丢失要如何解决?如果你有上面3个任意的问题,那这篇文章同样适合你,我将手把手教你如何安装修复渲染管线,看完你就了解了!在Unity中,他们都是渲染管线,它们的主要区别在于性能和功能。LWRP是早期版本的URP,它专门为移动设备和低端PC设计,旨在提供更高的性能。它使用基于顶点的光照和简化的后处理效果,可以在更低的硬件要求下运行。 阅读详情

说到线程同步就会想到在单线程中每次只能做一件事情,后面的程序代码必须等待前面的代码执行完才能接着执行。如果使用的是多线程的话,就要先考虑两个线程之间抢占资源的问题。如两个用一双筷子,两个人过要做独木桥,两个人看一本书等等。在java中提供了线程同步的机制来防止资源访问的冲突。 

首先来说说线程安全。

一、线程安全:

在实际开发中我们会遇到很多问题,因为多线程程序的情况有很多。以火车站售票系统为例,在代码中判断当前票数是否大于0,如果大于0则执行售票给乘客的功能,但是当两个线程同时访问这段代码时(假如此时只剩一张票),第一个线程将票售出,与此同时第二个线程也已经执行完成判断是否有票的判断,并得出票数大于零的情况,于是也会执行售票操作,这样就会产生负数;所以在编写多线程代码时应该注意线程安全问题,即两个线程同时存取单一对象的数据;

下面是一个实例一,主要模拟火车站售票系统的功能;

package ThreadSafe;

class ThreadSafeTest implements Runnable{
private int tickets=10;//设置当前票数
	@Override
	public void run() {
		System.out.println("----1111");
		// TODO Auto-generated method stub
		while(true){
			if(tickets>0){
				try {
					Thread.sleep(100);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				//输出当前线程的剩余票数
				System.out.println("tickets"+Thread.currentThread().getName()+":"+tickets--);
			}
		}
	}
	public static void main(String []args){
		ThreadSafeTest thread = new ThreadSafeTest();//实例化一个对象
		Thread A = new Thread(thread);//以该类对象实例化四个线程
		Thread B = new Thread(thread);
		Thread C = new Thread(thread);
		Thread D = new Thread(thread);
		A.start();
		B.start();
		C.start();
		D.start();
	}

}

上述代码输出结果:

 从上图可以看出,最后出售剩余的票数为负数,这在实际的售票系统中是需要避免的;

那么为什么会出现上述的情况呢?由于创建了4个线程,这4个线程都会执行run()方法,在ticke变量变为1的时候,线程0、线程1、线程2、线程3都会tickets变量有存储功能,当线程0执行run方法时,还没来得及做递减操作,就指定它调用了sleep()方法进入了就绪状态,这时线程1、线程2和线程3都进入了run()方法,发现变量依然大于0,但此时线程0休眠时间一到,将ticke变量递减,同时线程1,、线程2、线程3页都对tickets变量进行递减操作,从而产生了负值。

 二、线程同步机制

线程同步机制是用来干嘛用的呢?是用来解决资源共享问题的,基本上所有解决多线程资源中冲突问题的方法都是采用给定的定时时间只允许一个线程访问共享资源,这时就需要给共享资源加上一道锁。就好比你们班上有一本书在你手上,等你看完后,其他同学才能拿来阅读。

线程同步方式有两种:

1.同步代码块

2.同步方法

先来说一说同步代码块;

*同步代码块:

在java中提供了同步机制,可以有效的防止资源冲突。同步机制使用synchronized关键字。

下面一个实例二,只需在实例一种修改run()方法,把tickets操作设置在同步代码块中。

package ThreadSafe;

class ThreadSynchronized implements Runnable{
private int tickets=10;
//static Object obj;
@Override
public void run() {
	// TODO Auto-generated method stub
	while(true){
		synchronized(""){
			if(tickets>0){
				try {
					Thread.sleep(3000);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				//输出当前线程的票数
				System.out.println("tickets"+Thread.currentThread().getName()+":"+tickets--);
			}
		}
	}
}
public static void main(String []args){
	ThreadSynchronized thread = new ThreadSynchronized();//实例化一个对象
	Thread A = new Thread(thread);//以该类对象实例化四个线程
	Thread B = new Thread(thread);
	Thread C = new Thread(thread);
	Thread D = new Thread(thread);
	A.start();
	B.start();
	C.start();
	D.start();
	//obj = new Object();
}
}

输出结果:

 从上图可以看出输出结果打印票数没有出现负数,这时因为将资源放到了同步代码块中。这个代码块通常被称为临界区,它使用synchronized关键字建立,但是上述代码每次的输出结果会不一样,它的语法如下所示:

synchronized(Object){
    //实例代码
}

 通常将共享资源的操作放置在synchronized定义的区域中,这样当其他线程也获取到这个锁时,必须等待锁被释放才能进入该区域。Object为任意一个对象,每个对象都存在一个标志位,并具有两个值,分别为0和1。一个线程运行到同步代码块时首先检查该对象的状态,如果为0状态,表明此同步代码块中国存在其他线程在运行。这时该线程处于就绪状态,直到处于同步代码块中的线程执行完同步代码块中的代码为止。这时该对象的标志位被设置为1,该线程才能执行同步代码块中的代码,并将Object对象标志位设置为0,表示其他线程执行同步代码块中的代码。

*同步方法:

同步方法就是在方法前面用synchronized修饰,它的语法如下:

synchronized void f(){   //定义同步方法
   //代码
}

 当某个对象调用同步方法时,该对象上的其他方法必须等待该同步方法执行完毕后才能被执行。必须将每个能访问共享资源的方法修饰为synchronized,否则会出错;

下面是一个实例三代码,将共享资源放在类的同步方法中;

package ThreadSafe;

class ThreadSynMethod implements Runnable {
	private int tickets = 10;

	@Override
	public synchronized void run() {
		// TODO Auto-generated method stub
		while (true) {
			if (tickets > 0) {
				try {
					Thread.sleep(3000);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				// 输出当前线程的票数
				System.out.println("tickets" + Thread.currentThread().getName() + ":" + tickets--);
			}
		}
	}
	public static void main(String []args){
		ThreadSynMethod thread = new ThreadSynMethod();//实例化一个对象
		Thread A = new Thread(thread);//以该类对象实例化四个线程
		Thread B = new Thread(thread);
		Thread C = new Thread(thread);
		Thread D = new Thread(thread);
		A.start();
		B.start();
		C.start();
		D.start();
	}
}

从上图可以看出实例三的运行结果和实例二的运行结果一致,没有打印出负数的售票数。总而言之,无论是同步代码块还是同步方法都能实现线程的同步。

参考:java从入门到精通书籍 

Authentication Assertion Tickets,SAP 系统到系统单点登录里的短命凭证 SAP 系统间的身份传递机制存在 Authentication Assertion Ticket 和 SAP Logon Ticket 两种易混淆的凭证。前者用于系统间短时身份委托(有效期2分钟,通过HTTP头传输),后者用于浏览器SSO(可配置有效期,通过Cookie传输)。Assertion Ticket依赖签发系统的数字签名和严格的时间同步,适用于ABAP/Java系统间的后台作业调用。现代SAP架构已转向OAuth 2.0等标准协议,但老系统中仍需注意两种票据的关键差异:传输方式、有效期、接收方限制 阅读详情

相关推荐

睿尔曼超轻量仿人机械臂-ROS第一篇 启动机械臂的Moveit

本文主要讲述了睿尔曼六轴机械臂在ROS中的功能包配置,及如何根据文件启动Moveit做仿真。

realman_Rop的博客 7487

Java解决资源访问冲突(线程同步)

在单线程序中,每次只能做一件事情,后面的事情需要等待前面的事情完成后才可以进行,但如果使用多线程程序,就会发生两个线程抢占资源的问题。所以在多线程编程中需要防止资源之间访问的冲突,而Java提供了线程同步机制来防止这种冲突。 实际开发中,使用多线程程序的情况很多。这种多线程的程序通常会发生问题,就以火车站售票系统为例,在代码中判断当前票数是否大于0,如果大于0则执行将该票出售给乘客的功能,但当两个...

菜鸟踩坑 880

Docker部署Nextcloud私有云:MariaDB、OnlyOffice与HTTPS全栈实践

Nextcloud作为主流开源私有云平台,其稳定部署依赖Docker容器化、MariaDB数据库优化、OnlyOffice在线协作集成及HTTPS安全加固四大核心技术。理解Docker Compose服务健康检查机制与依赖等待原理,可避免因启动时序导致的500/404错误;掌握MariaDB字符集配置与InnoDB参数调优,是保障Nextcloud全文搜索与大文件上传可靠性的底层基础;而OnlyOffice的JWT兼容性控制与Nginx路径重写规则,则直接决定文档协同功能是否可用。在家庭NAS、边缘服务器或

weixin_30328063的博客 512

Java-线程安全问题、线程同步

Java-线程安全问题、线程同步

weixin_65049289的博客 350

AI开发提效10倍:从需求到部署的全流程实战指南(附Prompt模板)

用AI开发不是“偷懒”,而是把时间花在更有价值的地方——原来花80%时间写重复代码,现在用AI搞定后,能把精力放在“优化用户体验”“提升系统性能”这些核心工作上,这才是AI给开发者的真正红利。如果你还没开始用AI做开发,建议从“写一个简单接口”“补一段注释”开始尝试,先用起来再优化方法。记住:AI是工具,不是对手,学会驾驭它,你会发现开发效率提升的同时,还能告别无效加班。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1525

【谷粒商城】分布式事务与下单

=购物车== 构建gulimall-cart,复制静态资源到nginx,修改网关 购物车分为离线购物车和登录购物车 离线购物车重启浏览器了也还有 1、购物车需求 特点:读多写少,放入数据库并不合适 登录状态:登录购物车 放入数据库 mongodb 放入redis(采用) 登录以后,将离线购物车里合并后清空离线购物车 未登录状态:离线购物车 放入localstorage浏览器的技术 cookie WebSQL 放入redis(采用) 浏览器重启后还在 2、购物车VO (1) 数据结构分析

努力充实,远方可期 1万+

【java多线程】线程同步问题:用同步代码块、同步方法和重入锁实现线程同步

同步是执行或调用一个方法时,每次都需要拿到对应的结果才会继续往后执行;异步与同步相反,它会在执行或调用一个方法后就继续往后执行,不会等待获取执行结果。二者的区别就是处理请求发出后,是否需要等待请求结果,再去继续执行其他操作。

m0_65277261的博客 2231

wifi/BT芯片RTL8723DS驱动移植和测试之一wifi篇

本文主要介绍如何在stm32mp157中移植并测试芯片RTL8723DS的wifi功能。

汉尼拔勇闯天涯 8737

线程及线程的同步互斥

目录线程的简单介绍信号量互斥量条件变量1.线程的简单介绍 线程的简单介绍 信号量 互斥量 条件变量 1.线程的简单介绍

weixin_45738899的博客 2970

ESP32S3 TLS 握手WIFI可用但是在蜂窝热点下卡死:排查方法与根因

设备卡在等。

摸鱼专家 85

系统架构最佳实践 -- 统一身份认证系统

设计和实现一个高效、安全的统一身份认证系统需要考虑到系统架构设计、用户认证与授权、用户身份管理、安全性保障、日志记录与审计、高可用性与容错性,以及用户体验优化等多个方面。通过合理的架构设计、安全措施和用户体验优化,可以构建一个满足用户需求、提供安全可靠的身份认证服务的系统。本文将总结统一身份认证系统的架构设计与实践经验,帮助读者了解如何设计和实现一个高效、安全的统一身份认证系统。统一身份认证系统应支持详细的日志记录和审计功能。通过合理的身份认证策略和授权机制,可以确保用户身份的准确性和信息的安全性。

xiaoli8748的专栏 1702

什么是线程同步和线程异步?

1、什么是线程同步和线程异步 线程同步:是多个线程同时访问同一资源,等待资源访问结束,浪费时间,效率不高 线程异步:访问资源时,如果有空闲时间,则可在空闲等待同时访问其他资源,实现多线程机制 异步处理就是,你现在问我问题,我可以不回答你,等到我有时间了再处理你这个问题,同步就是要立即处理这个问题,直到信息初六完成后才返回 消息句柄;异步信息收到后将在后台处理一段时间,而早在信息处理结束前...

九斤 1万+

【WRF安装第三期(Ubuntu)】搭建WRF编译所需系统-第三方依赖库安装

WRF安装第三期:搭建WRF编译所需系统-第三方依赖库安装

WW、forever的博客 3137

c++线程同步

一、为什么要进行线程同步? 在程序中使用多线程时,一般很少有多个线程能在其生命期内进行完全独立的操作。更多的情况是一些线程进行某些处理操作,而其他的线程必须对其处理结果进行了解。正常情况下对这种处理结果的了解应当在其处理任务完成后进行。如果不采取适当的措施,其他线程往往会在线程处理任务结束前就去访问处理结果,这就很有可能得到有关处理结果的错误了解。例如,多个线程同时访问同一个全局变量,如果都是读取操作,则不会出现问题。如果一个线程负责改变此变量的值,而其他线程负责同时读取变量内容,则不能保证读取到的数据是经

FairLikeSnow的博客 2171

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Python的线程03 线程同步

正式的Python专栏第42篇,同学站住,别错过这个从0开始的文章! 前面两篇文章介绍了线程概念和多线程程序的代码演示,但在多线程程序中,它们互相独立打印的时间却是错乱的! 如下图,明明t-0 > t-1 > t-2 (按照线程创建时间早晚排列)。最后输出居然是t-1最落后。 我们怎么样做避免错乱呢, 下面看看。 线程同步 多线程,就是多个独立的运行单位,同时执行同样的事情。 多线程不是已经做到同时执行了吗?还需要同步干嘛? 是的,线程是同时被调用执行了,但是每个线程之间互相独立,也互相竞.

持续学习持续开发,我是雷学委! 1535

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

简述线程同步和线程通信及如何实现线程间的同步

线程同步的具体实现方式有很多,包括临界区对象、互斥对象(Mutex)、信号量(Semaphore)、事件对象(Event)等。线程同步是指当有一个线程在对内存进行操作时(如读取、写入等),其他线程都不可以对该内存地址进行操作,直到该线程完成操作,其他线程才能继续对该内存地址进行操作。线程同步用于确保多个线程对共享资源的访问是有序和一致的,而线程通信则用于实现多个线程之间的信息交换和协作。在Java中,有多种方式可以实现线程间的同步,以确保多个线程在访问共享资源时不会出现数据不一致或冲突。

m0_46552684的博客 1059

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

线程同步和线程通讯

本文转载自:http://android.group.iteye.com/group/wiki/3083-java-sync-communication   线程同步 什么是线程同步? 当使用多个线程来访问同一个数据时,非常容易出现线程安全问题(比如多个线程都在操作同一数据导致数据不一致),所以我们用同步机制来解决这些问题。 实现同步机制有两个方法: 1。同步代码块: synchro

KBKYBAN的专栏 792

线程同步的三种方式

线程同步的三种方式:解决了多线程操作的安全问题。

qq_45453784的博客 7751

Linux线程同步与互斥:【线程互斥】【线程同步】【线程池】

生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区, 平衡了生产者和消费者的处理能力。因为我在当前的进程没有进行释放锁的操作,我是持有锁被切换的,相当于拿着钥匙,钥匙不给其他线程,其他线程也只能干等着,等我回来释放锁,其他线程才能展开锁的竞争,进入临界区。• 但有时候,很多变量都需要在线程间共享,这样的变量称为共享变量,可以通过数据的共享,完 成线程之间的交互。

2301_81699364的博客 1282

JAVA多线程——线程同步机制,同步方法和同步块

JAVA多线程——线程同步机制,同步方法和同步块 并发:同一个对象被多个线程同时操作 线程同步:处理多线程问题时,多个线程访问同一个对象,并且某个对象还想修改这个线程。这时候就需要线程同步。线程同步其实就是一种等待机制,多个需要同时访问此对象的线程进入这个对象的等待池形成队列,等待前面线程使用完毕,下一个线程再使用。 锁机制:由于同一进程的多个线程共享同一块存储空间,在带来方便的同时,也带来的访问冲突问题,为了保证数据在方法中被访问的正确性,在访问时加入锁机制(synchronized),当一个线程获得对象

万里顾一程的博客 2507

线程的同步 线程池

什么是线程的同步? 多个线程操作同一个资源的时候回出现资源争夺问题,这就需要线程的同步。 线程的同步要对同一个对象进行,不同对象无法进行线程同步。 线程同步其实就是一种等待机制, 多个需要同时访问此对象的线程进入这个对象的等待池形成队列,等待前面线程使用完毕,下一个线程再使用。 实现线程同步的三种方式 synchronized实现线程同步 同一个进程的多个线程共享同一块存储空间,在带来方便的同时,也带来了访问冲突问题,为了保证数据在方法中被访问是的正确性,在访问时加入了锁机制synchronized,当一个

NuanShuTT的博客 1727

线程安全,线程同步,解决线程同步问题

线程安全,线程同步,解决线程同步问题,synchronized,同步代码块,同步方法

weixin_46140377的博客 883

线程同步方案

本片文章介绍了实现线程同步的三种方法1、同步代码块2、同步方法3、Lock锁是同步代码块好还是同步方法好一点?范围上:同步代码块锁的范围更小,同步方法锁的范围更大。可读性:同步方法更好。而对于lock锁就比较灵活了。

qq_53118426的博客 1172

线程同步,为什么要引入线程同步?

线程同步,为什么要引入线程同步? 多个线程同时访问共享资源时候,如果没有先来后到,可能造成结果的不可再现性,使得结果背离预期的结果,例如多人抢少量票,银行取钱等. 线程同步的实现是依靠队列和锁来实现的 java中的锁有两种 Syschronized同步锁,既可以修饰同步代码块,也可以去修饰方法,默认的钥匙是this的类对象. package ThreadDemo2; public class TicketThread extends Thread{ static int num=10000;

m0_46958163的博客 862
上一篇: java Scanner类的学习
下一篇: 线程死锁
coder150806
博客等级 码龄8年 79粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值