沧州网站建设费用,crm管理系统哪个好用,长沙seo外包服务,网站建设与管理题库Java中 没处理好同步 导致两个线程同时为一个static变量赋值 会导致什么后果#xff1f; Java中 没处理好同步 导致两个线程同时为一个static变量赋值 会导致什么后果#xff1f;仅仅是多耗资源还是会引发异常#xff1f;
不会耗资源 也不会引发异常 而是程序出现逻辑错误,…Java中 没处理好同步 导致两个线程同时为一个static变量赋值 会导致什么后果 Java中 没处理好同步 导致两个线程同时为一个static变量赋值 会导致什么后果仅仅是多耗资源还是会引发异常
不会耗资源 也不会引发异常 而是程序出现逻辑错误,如本来该出现 3 的地方出现了 2 …,这比前两种情况更严重
Java多线程中static变量的使用
线程是我们项目中绕不过的重点领域。提到线程就常会听到线程安全的术语。那什么是线程安全呢通俗点说就是线程访问时不产生资源冲突。其实这是一个有点难以定义的概念不是很容易让人一听就懂的概念。“一个类可以被多个线程安全调用就是线程安全的”《Java编程实践》。
来说说静态变量、实例变量、局部变量在多线程下的安全问题吧
一静态变量线程非安全
1、静态变量使用static关键字定义的变量。static可以修饰变量和方法也有static静态代码块。被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说它不依赖类特定的实例被类的所有实例共享。只要这个类被加载Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。因此static对象可以在它的任何对象创建之前访问无需引用任何对象。
用public修饰的static成员变量和成员方法本质是变量和全局方法当声明它的类的对象时不生成static变量的副本而是类的所有实例共享同一个static变量。
2、静态变量使用的场景
(1)对象间共享值时
(2)方便访问变量时
3、静态方法使用注意事项
(1)不能在静态方法内使用非静态变量即不能直接访问所属类的实例变量
(2)不能在静态方法内直接调用非静态方法
(3)静态方法中不能使用this和super关键字
4、验证静态变量的线程安全性
(1)从程序执行的图中我们可以看出执行结果中有错误数据证明了静态变量是存在资源冲突问题的。
(2)程序运行结果图 5、结论静态变量也称为类变量属于类对象所有位于方法区为所有对象共享共享一份内存一旦值被修改则其他对象均对修改可见故线程非安全。
二实例变量单例时线程非安全非单例时线程安全
1、实例变量实例变量属于类对象的也就是说属于对象实例私有在虚拟机的堆中分配。
2、验证实例变量的线程安全性
(1)从程序截图中我们可以看到当为单例模式时会产生资源冲突当非单例模式时则不会产生线程冲突。
(2)程序运行结果图
图1 图2 3、结论实例变量是实例对象私有的系统只存在一个实例对象则在多线程环境下如果值改变后则其它对象均可见故线程非安全如果每个线程都在不同的实例对象中执行
则对象与对象间的修改互不影响故线程安全。
三局部变量线程安全
1、局部变量定义在方法内部的变量。
2、验证局部变量的安全性
(1)从程序截图中可以看出局部变量在多线程下没有产生资源冲突的问题
(2)程序运行结果图 3、结论每个线程执行时都会把局部变量放在各自的帧栈的内存空间中线程间不共享故不存在线程安全问题。
四静态方法的线程安全性
1、静态方法中如果没有使用静态变量则没有线程安全的问题
静态方法内的变量每个线程调用时都会新创建一份不会公用一个存储单元故不存在线程冲突的问题。
总结 java在执行静态方法时会在内存中拷贝一份如果静态方法所在的类里面没有静态的变量那么线程访问就是安全的比如在javaee中服务器必然会多线程的处理请求此时如果设计全局需要调用的静态方法可用此种设计。 java在执行静态方法时如果使用静态变量同时类的函数设计时使用到了静态数据最好在调用函数时使用synchronized关键字否则会导致数据的不一致行。 加静态全局的变量在多线程访问下定会出现数据的不一致行最好使用synchronized关键字确保数据的一致性典型的代表就是单例模式。 java是线程安全的即对任何方法包括静态方法都可以不考虑线程冲突但有一个前提就是不能存在全局变量。如果存在全局变量则需要使用同步机制。
加入synchronized关键字的静态方法称为同步静态方法。 在访问同步静态方法时会获取该类的“Class”对象所以当一个线程进入同步的静态方法中时线程监视器获取类本身的对象锁其它线程不能进入这个类的任何静态同步方法。它不像实例方法因为多个线程可以同时访问不同实例同步实例方法。这个其实就是操作系统中的用信号量实现进程的互斥与同步问题如果涉及在同一个类中有多个静态方法中处理多线程共享数据的话那就变成用信号量解决生产者-消费者问题。也就是说静态方法是一份临界资源对静态方法的访问属于进入临界区对静态变量的修改是一份临界资源对静态变量的修改属于进入临界区。