这样的Java代码是线程安全的吗?

问题描述

public class IncreaseTest {private int value = 0;public synchronized int increment() { return value++;}}方法increment()是线程安全的吗?还是必须要加上关键字:volatile private volatile int value = 0;

解决方案

是的,因为你已经加了synchronized keyword 了,就是所谓的原子性保证了。有关原子性的问题可以看看 《thinking in java》 的 concurrency 部分内容。
解决方案二:
increment()方法前加了synchronized关键字修饰,这个方法是线程安全
解决方案三:
不是线程安全的,同步的关键字在只能提高安全级别,不能绝对完全解决同步问题,曾经就在项目中碰到了这类问题,在同步下面居然能实例化两个单例
解决方案四:
如果其他的方法没用通过反射机制直接方位value,那么就是安全的
解决方案五:
通过添加synchronized关键字,就可以保证在同一时间只能有一个访问,他会添加锁机制。然而volatile该关键字是在处理多线程时,变量能够共享,例如,定义一个变量K,当有多个线程同时都需要使用K时,volatile关键字可以保证,每个线程在用K时,都会使用最新的K值。volatile关键字可以保证每个线程在使用K值之前,去刷新k所在的内存值,从而保证每个线程使用的都是最新的值。但是volatile并不能一定保证每次的数据都是你想要的,因为这还需要考虑到jvm的堆和栈。
解决方案六:
是线程安全的。value是private类型。只能通过increment方法操作,并且increment已经做了同步
解决方案七:
如果可以通过反射访问该字段,则不安全。如果所有的访问都是通过increment方法访问,则是线程安全的。sync关键字限制了同一时刻只有一个线程可以访问该方法。

时间: 2024-12-06 02:38:25

这样的Java代码是线程安全的吗?的相关文章

诊断Java代码:孤线程(Orphaned Thread)错误模式

在多线程代码中,使用驱动其它线程所负责的动作的单个主线程是常见的.这个主线程发送消息,通常是通过把它们放到一个队列中,然后其它线程处理这些消息.但是如果主线程抛出一个异常,那么剩余的线程会继续运行,等待更多输入到该队列,导致程序冻结.在诊断 Java 代码的这一部分中,专职 Java 开发者兼兼职捉虫者 Eric Allen 讨论检测.修复和避免这一错误模式. 用多线程编写代码对程序员大有好处.多线程能使编程(和程序)进行得快得多,而且代码能有效得多地使用资源.然而,跟生活中的很多事情一样,多线

线程-下面是一段Java代码,里面有几处看不懂,望大神指教,不胜感激。

问题描述 下面是一段Java代码,里面有几处看不懂,望大神指教,不胜感激. package 线程; import java.awt.*;import java.awt.event.*; import javax.swing.*; public class TestThread extends JFrame { /** * */ //private static final long serialVersionUID = 1L; JPanel jPanel1 = new JPanel(); JBu

诊断Java代码

诊断Java代码: Broken Dispatch错误模式 诊断Java代码: Double Descent错误模式 诊断Java代码: Impostor Type错误模式 诊断Java代码: Java编程中的断言和时态逻辑 诊断Java代码: Liar View错误模式 诊断Java代码: Repl提供交互式评价 诊断Java代码: 单元测试与自动化代码分析协同工作 诊断Java代码: 将时态逻辑用于错误模式 诊断Java代码: 进行记录器测试以正确调用方法 诊断Java代码: 空标志错误模式

Java多线程和线程池

版权声明:本文为博主原创文章,转载注明出处http://blog.csdn.net/u013142781 1.为什么要使用线程池 在Java中,如果每个请求到达就创建一个新线程,开销是相当大的.在实际使用中,服务器在创建和销毁线程上花费的时间和消耗的系统资源都相当大,甚至可能要比在处理实际的用户请求的时间和资源要多的多.除了创建和销毁线程的开销之外,活动的线程也需要消耗系统资源.如果在一个jvm里创建太多的线程,可能会使系统由于过度消耗内存或"切换过度"而导致系统资源不足.为了防止资源

java中的线程

编写具有多线程能力的程序经常会用到的方法有: run(),start(),wait(),notify(),notifyAll(),sleep(),yield(),join() 还有一个重要的关键字:synchronized 本文将对以上内容进行讲解. 一:run()和start() 示例1: public class threadtest extends thread{public void run(){for(int i=0;i<10;i++){system.out.print(" &q

诊断Java代码: Java编程中的断言和时态逻辑

虽然传统断言可以增加对 Java 代码执行的检查次数,但有许多检查不能用它们来执行.弥补这一缺陷的方法是使用"时态逻辑",它是一种用于描述程序状态如何随时间而更改的形式体系.在本文中,Eric Allen 将讨论断言,介绍时态逻辑并描述用于处理程序中时态逻辑断言的工具 (下一篇文章将检查以前的错误模式和时态逻辑的应用程序). 我们大家同意对 Java 代码检查得越多就越好,我们检查了断言在测试新的和改进的编程中的用法.虽然传统断言可以增加执行的检查次数,但有许多检查不能用它们来执行.

诊断Java代码: 将时态逻辑用于错误模式

尽管传统的断言可以增加对 Java 代码所作的检查次数,但仅用它们,还是有许多检查无法完成.处理这种情况的方法之一就是使用 时态逻辑.请回忆上个月的文章" Assertions and temporal logic in Java programming",时态逻辑有助于提供比程序中的方法更有力的断言,从而有助于增强用其它方式难以正式表达的不变量. 我们不必费力搜寻去发现有助于防止我们程序出错的许多有用的不变量.实际上,可以通过使用此类时态逻辑断言来加大我们消除一些最常见错误模式的力度

多种负载均衡算法及其Java代码实现

首先给大家介绍下什么是负载均衡(来自百科) 负载均衡 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展 网络设备和 服务器的带宽.增加 吞吐量.加强网络数据处理能力.提高网络的灵活性和可用性. 负载均衡,英文名称为Load Balance,其意思就是分摊到多个操作单元上进行执行,例如Web 服务器. FTP服务器. 企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务. 本文讲述的是"将外部发送来的请求均匀分配到对称结构中的某一台服务器上"的各种算法,并以Java代

Spring学习笔记1——IOC: 尽量使用注解以及java代码(转)

在实战中学习Spring,本系列的最终目的是完成一个实现用户注册登录功能的项目. 预想的基本流程如下: 1.用户网站注册,填写用户名.密码.email.手机号信息,后台存入数据库后返回ok.(学习IOC,mybatis,SpringMVC的基础知识,表单数据验证,文件上传等) 2.服务器异步发送邮件给注册用户.(学习消息队列) 3.用户登录.(学习缓存.Spring Security) 4.其他. 边学习边总结,不定时更新.项目环境为Intellij + Spring4.   一.准备工作. 1