同步和异步有何异同,阻塞与非阻塞,在什么情况下分别使用他们?举例说明
如果数据将在线程间共享。例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。
当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。
同步就是指:多个线程可以同时访问同一个资源。比如对一个变量而言,线程们可以同时对他进行读写。 异步就是指:多个线程不能同时对资源进行某项操作,比如对上面变量的同时写操作。如果进行同步写操作,容易产生错误,我们则可以通过互斥量来解决。
以通讯为例
同步:发送一个请求,等待返回,然后再发送下一个请求
异步:发送一个请求,不等待返回,随时可以再发送下一个请求
并发:同时发送多个请求。
怎么样做到线程安全?
如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。
比如一个 ArrayList 类,在添加一个元素的时候,它可能会有两步来完成:1. 在 Items[Size] 的位置存放此元素;2. 增大 Size 的值。
在单线程运行的情况下,如果 Size = 0,添加一个元素后,此元素在位置 0,而且 Size=1;
而如果是在多线程情况下,比如有两个线程,线程 A 先将元素存放在位置 0。但是此时 CPU 调度线程A暂停,线程 B 得到运行的机会。线程B也向此 ArrayList 添加元素,因为此时 Size 仍然等于 0 (注意哦,我们假设的是添加一个元素是要两个步骤哦,而线程A仅仅完成了步骤1),所以线程B也将元素存放在位置0。然后线程A和线程B都继续运行,都增加 Size 的值。
那好,现在我们来看看 ArrayList 的情况,元素实际上只有一个,存放在位置 0,而 Size 却等于 2。这就是“线程不安全”了。
如何做到线程安全:
四种方式 sychronized关键字
1. sychronized method(){}
2. sychronized (objectReference) {/*block*/}
3. static synchronized method(){}
4. sychronized(classname.class)
其中1和2是代表锁当前对象,即一个对象就一个锁,3和4代表锁这个类,即这个类的锁。要注意的是sychronized method()不是锁这个函数,而是锁对象,即:如果这个类中有两个方法都是sychronized,那么只要有两个线程共享一个该类的reference,每个调用这两个方法之一,不管是否同一个方法,都会用这个对象锁进行同步。
注意:long 和double是简单类型中两个特殊的咚咚:java读他们要读两次,所以需要同步。
分享到:
相关推荐
"一点课堂 JAVA核心知识点整理.zip"这个压缩包文件包含了关于Java编程的关键概念和技能的详细总结,非常适合初学者和有经验的开发者进行学习和复习。 首先,Java的核心知识点包括基础语法。这包括变量声明、数据...
Java提供了Thread类和Runnable接口来实现多线程,同时JavaFX也提供了Task和Service类来更方便地处理FX应用程序中的后台任务。 7. **事件驱动编程**: JavaFX基于事件驱动模型,用户与界面的交互(如点击按钮)会触发...
Java提供了Thread类和Runnable接口来创建多线程程序。 以上便是根据提供的Java练习题库内容整理出的知识点概述,掌握了这些基础知识点,对进一步学习Java的高级特性和开发实际应用程序都有很大帮助。
### Java基础知识大总结 #### 一、基础概念与特性 1. **Null的打印结果**:在Java中,如果尝试打印一个null值的对象引用,输出结果将会是`null`。 2. **字符串常量的拼接问题**:当在字符串中出现如`'10'`这样的...
Java的线程机制可以帮助你实现这一点,如创建Thread类的子类或者使用Runnable接口。 6. **IO流**:用于读写数据,如保存和加载火车信息、用户购票记录等。Java的FileInputStream和FileOutputStream可以用来读写文件...
标签也进一步确认了这一点,同样显示为"Java code Java code"。下面我们将详细讨论Java编程语言的关键知识点,并可能在这些文件中找到的相应内容。 1. **Java基础知识**:Java是一种面向对象的、跨平台的编程语言,...
`Thread`或`Runnable`接口可用于实现这一点。 4. **用户界面(UI)设计**:如果程序具有图形用户界面,可能需要使用Java Swing或JavaFX来创建按钮、进度条等控件,实现与用户的交互。 5. **事件监听**:在UI中,...
"java入门非常的浅显易懂"这个标题暗示了我们将要探讨的内容是针对新手的Java基础知识,而描述中的“很好的入门书”进一步确认了这一点,意味着我们将深入浅出地讲解Java的基本概念。 1. **Java简介**:Java是由Sun...
以上是Java技术500篇可能涉及的主要知识点,每一点都值得深入学习和实践,以提升你的Java编程能力。在实际开发中,还需要结合设计模式、最佳实践以及不断涌现的新技术和框架,如Spring Boot、MyBatis、Docker、...
1. **Java多线程基础知识**:Java多线程允许程序同时执行多个任务,这是通过创建和管理线程实现的。Java提供了两种创建线程的方式:继承Thread类和实现Runnable接口。线程的状态包括新建、就绪、运行、阻塞和终止,...
Java通过内置的Thread类和它的子类来支持多线程编程,提供了一套丰富的API来处理多线程环境下的复杂问题。 Java语言的另一个重要特性是安全性。Java通过字节码验证器以及类加载器来保证应用程序的安全性。字节码...
Java的Thread类和ExecutorService可以帮助实现这一目标。 8. **事件处理**:Java的事件监听机制使得播放器能够响应用户的操作,如点击播放按钮或调整音量滑块。 9. **资源管理**:播放器需要有效地管理内存和系统...
这个“java程序设计课件”为那些已经有一定Java基础的学习者提供了深入学习和巩固知识的机会。课件中不仅涵盖了Java的基础知识,还涉及了如何实现数据库连接,这是在实际项目开发中非常实用的一项技能。 首先,Java...
Java的EventListener接口和相关类可以帮助我们实现这一点。 5. **算法**:游戏规则的实现需要算法支持,比如洗牌算法、判断胜败的逻辑等。 6. **IO流**:如果游戏有保存和加载功能,那么文件输入输出流...
《JAVA解惑》这本书主要针对...以上是《JAVA解惑》一书中可能涉及的部分知识点,每一点都值得深入学习和实践。通过掌握这些内容,开发者可以更好地解决Java编程中的各种问题,提升编程技能,写出更高效、更可靠的代码。
本资源“java学习笔记”源自B站上的黑马程序员Java教学课程,虽然没有图片辅助,但通过文本资料,我们可以深入理解Java的核心概念和关键知识点。 首先,Java的学习通常从基础语法开始,包括变量、数据类型、运算符...
- **知识点**: 在Java中,通过继承`Thread`类来创建线程的方式之一。 - **选项分析**: - A、`classA4 extends Thread`: 正确的继承方式,但缺少`run()`方法实现。 - B、`classA4 implements Thread`: 错误,因为`...
Java的Thread类和Runnable接口可以帮助你实现这一点。同时,线程同步也是需要注意的问题,以避免多个线程间的冲突。 6. **资源管理**:音乐文件和其他资源的加载和释放是资源管理的一部分。理解如何正确地打开、...
总的来说,通过分析和实现这两个Java小游戏,初学者可以巩固理论知识,提升编程技能,并逐渐培养解决实际问题的能力。这是一个很好的学习路径,不仅能激发学习兴趣,也有助于理解Java编程的精髓。希望这个资源对你的...
在Java中,我们可以使用`while(true)`循环来实现这一点,并通过`Thread.sleep()`方法控制游戏的帧率,以确保游戏流畅运行。 接下来,我们来看看图形用户界面(GUI)的构建。Java提供了`java.awt`和`javax.swing`包...