java两个线程对变量进行加1操作实例分析
1--错误的常规写法
<code>public static int i=0;</code><code>public static void add(){</code><code> i=i+1;</code><code> action();</code><code>}</code><code>public static void action(){</code><code> System.out.println("==>"+Thread.currentThread().getName()+":"+i);</code><code>}</code><code>public static void main(String[] args) throws InterruptedException {</code><code> Thread t1 = new Thread(SysUserServiceImpl::add,"t1");</code><code> Thread t2= new Thread(SysUserServiceImpl::add,"t2");</code><code> t1.start();</code><code> t2.start();</code><code>}</code><code>运行结果==></code><code>==>t1:1</code><code>==>t2:2</code><code><br></code><code>==>t1:2</code><code>==>t2:1</code><code><br></code><code>==>t1:2</code><code>==>t2:2</code>
每次运行结果不一致,多线程环境下,t1对共享内存中的i进行+1操作,但未将值刷新到主内存,此时恰好t2也对i取到还是0进行+1操作,使得最后结果i都为1,同理t1处理完为1,t2处理完为2。多次运行结果都不一致。
改进方法1 --同步锁
<code>public class ThreadException {</code><code> public static volatile int i=0;</code><code> public static void add(){</code><code> synchronized (ThreadException.class){</code><code> i=i+1;</code><code> action();</code><code> }</code><code> }</code><code> public static void action(){</code><code> System.out.println("==>"+Thread.currentThread().getName()+":"+i);</code><code> }</code><code> public static void main(String[] args) throws InterruptedException {</code><code> Thread t1 = new Thread(ThreadException::add,"t1");</code><code> Thread t2= new Thread(ThreadException::add,"t2");</code><code> t1.start();</code><code> t2.start();</code><code><br></code><code> }</code><code>}</code>
优点:实现简单
缺点:加锁粒度大,性能低下,分布式环境,多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
<code>public class ThreadException {</code><code> public static volatile int i=0;</code><code> public static void action(){</code><code> System.out.println("==>"+Thread.currentThread().getName()+":"+i);</code><code> }</code><code><br></code><code> static Lock lock=new ReentrantLock();</code><code> public static void inc() {</code><code> lock.lock();</code><code> try {</code><code> Thread.sleep(1);</code><code> i=i+1;</code><code> action();</code><code> } catch (InterruptedException e) {</code><code> e.printStackTrace();</code><code> } finally {</code><code> lock.unlock();</code><code> }</code><code> }</code><code> public static void main(String[] args) throws InterruptedException {</code><code> Thread t1 = new Thread(ThreadException::inc,"t1");</code><code> Thread t2= new Thread(ThreadException::inc,"t2");</code><code> t1.start();</code><code> t2.start();</code><code> }</code><code>}</code><code><br></code>
分布式锁:保证多个节点同步执行
实现方案:1。基于数据库,2.基于redis缓存,3.基于zookeeper
以上是java两个线程对变量进行加1操作实例分析的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

Java 8引入了Stream API,提供了一种强大且表达力丰富的处理数据集合的方式。然而,使用Stream时,一个常见问题是:如何从forEach操作中中断或返回? 传统循环允许提前中断或返回,但Stream的forEach方法并不直接支持这种方式。本文将解释原因,并探讨在Stream处理系统中实现提前终止的替代方法。 延伸阅读: Java Stream API改进 理解Stream forEach forEach方法是一个终端操作,它对Stream中的每个元素执行一个操作。它的设计意图是处
