java 多线程 互斥_Java多线程与并发应用-(2)-线程互斥synchronized

本文详细探讨了Java中多线程环境下如何实现互斥,通过一个打印名字的例子展示了线程无序执行导致的问题。文章介绍了synchronized关键字在方法和代码块级别的用法,以及它如何保证代码的原子性和线程的有序性。同时,还提到了避免死锁、同步锁的选择以及synchronized的内存可见性等关键概念。
摘要由CSDN通过智能技术生成

首先请看下面的例子:

package com.lipeng;

public class SynchronizedDemo {

public static void main(String[] args) {

final Print print=new Print();

for(int i=0;i<1000;i++)

{

new Thread(){

@Override

public void run() {

print.printName("huangfeihong");

}

}.start();

new Thread(){

@Override

public void run() {

print.printName("zhangsanfeng");

}

}.start();

}

}

}

class Print

{

/**

* 打印名字

* @param name

*/

public void printName(String name)

{

for(int i=0;i

{

System.out.print(name.charAt(i));

}

System.out.println();

}

}

例子中,Print类的作用是打印一个名字,但是一个一个字符打印的,主程序中开启两个线程,分别打印

1000次huangfeihong和zhangsanfeng.

结果如下:

infodetail-732045.html

以上答案并不是我们期望看到的。那么为什么会出现这种情况呢?

多个线程执行时,CPU对线程的调度是随机的,我们不知道当前程序被执行到哪步就切换到了下一个线程,

一个最经典的例子就是银行汇款问题,一个银行账户存款100,这时一个人从该账户取10元,同时另一个人向该

账户汇10元,那么余额应该还是100。那么此时可能发生这种情况,A线程负责取款,B线程负责汇款,A从主内

存读到100,B从主内存读到100,A执行减10操作,并将数据刷新到主内存,这时主内存数据100-10=90,而B

内存执行加10操作,并将数据刷新到主内存,最后主内存数据100+10=110&#

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值