java两个线程对变量进行加1操作实例分析
发表于:2025-01-24 作者:千家信息网编辑
千家信息网最后更新 2025年01月24日,本篇内容主要讲解"java两个线程对变量进行加1操作实例分析",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"java两个线程对变量进行加1操作实例分析"吧!
千家信息网最后更新 2025年01月24日java两个线程对变量进行加1操作实例分析
本篇内容主要讲解"java两个线程对变量进行加1操作实例分析",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"java两个线程对变量进行加1操作实例分析"吧!
1--错误的常规写法
public static int i=0;
public static void add(){
i=i+1;
action();
}
public static void action(){
System.out.println("==>"+Thread.currentThread().getName()+":"+i);
}
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(SysUserServiceImpl::add,"t1");
Thread t2= new Thread(SysUserServiceImpl::add,"t2");
t1.start();
t2.start();
}
运行结果==>
==>t1:1
==>t2:2
==>t1:2
==>t2:1
==>t1:2
==>t2:2
每次运行结果不一致,多线程环境下,t1对共享内存中的i进行+1操作,但未将值刷新到主内存,此时恰好t2也对i取到还是0进行+1操作,使得最后结果i都为1,同理t1处理完为1,t2处理完为2。多次运行结果都不一致。
改进方法1 --同步锁
public class ThreadException {
public static volatile int i=0;
public static void add(){
synchronized (ThreadException.class){
i=i+1;
action();
}
}
public static void action(){
System.out.println("==>"+Thread.currentThread().getName()+":"+i);
}
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(ThreadException::add,"t1");
Thread t2= new Thread(ThreadException::add,"t2");
t1.start();
t2.start();
}
}
优点:实现简单
缺点:加锁粒度大,性能低下,分布式环境,多JVM条件,synchronized失效,synchronized 只是本地锁,锁的也只是当前jvm下的对象,在分布式场景下,要用分布式锁
改进方法2 AtomicInteger
public class ThreadException { private static AtomicInteger num = new AtomicInteger(0); public static void add(){ int i = num.getAndIncrement(); action(i); } public static void action(int i){ System.out.println("由"+i+"==>"+Thread.currentThread().getName()+":"+num); } public static void main(String[] args) throws InterruptedException { Thread t1 = new Thread(ThreadException::add,"t1"); Thread t2= new Thread(ThreadException::add,"t2"); t1.start(); t2.start(); }}
改进方法3 lock
public class ThreadException {
public static volatile int i=0;
public static void action(){
System.out.println("==>"+Thread.currentThread().getName()+":"+i);
}
static Lock lock=new ReentrantLock();
public static void inc() {
lock.lock();
try {
Thread.sleep(1);
i=i+1;
action();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(ThreadException::inc,"t1");
Thread t2= new Thread(ThreadException::inc,"t2");
t1.start();
t2.start();
}
}
分布式锁:保证多个节点同步执行
实现方案:1。基于数据库,2.基于redis缓存,3.基于zookeeper
到此,相信大家对"java两个线程对变量进行加1操作实例分析"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
线程
分布式
方法
结果
两个
变量
实例
实例分析
分析
运行
一致
内存
内容
只是
环境
同步
处理
学习
低下
实用
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
姑苏区数据网络技术收费
吃鸡战场国际服服务器繁忙怎么办
广东农信社软件开发岗
服务器怎么部署
服务器 64g内存
网络技术发展的参考文献
青春济南网络安全
大话手游服务器人数
产品出厂的数据库口令
him的服务器游戏时间
单片机对讲机软件开发费用
工业网络技术专业就业
网络服务器地址和服务端口怎么查
设备滥用属于网络安全犯罪吗
数据库中全局变量什么开头
天津商业大学网络安全和信息化
redis实时数据库
汉阳定制软件开发中心
广州软件开发培训机构排行
浙江万卡汇软件开发有限公司
为什么完美老是连接服务器失败
软件开发阶段需要写的文档
昆山正规网络技术推荐咨询
删除网络安全助手
输了网络安全密钥是多少
信息化网络安全演讲会议稿
戴尔服务器工作温度
江苏软件开发设施品质保障
沈阳网络安全警察报警电话
迈克生物软件开发