多线程三之线程同步

本文探讨了多线程环境下线程同步的重要性,分析了因未同步导致的数据错误问题,并介绍了使用`synchronized`关键字修饰方法和代码块实现线程同步的解决方案,确保了共享资源的安全访问。
摘要由CSDN通过智能技术生成

线程同步
为什么会出现线程同步这个概念呢?我们都知道线程是进程的基本运行单位,进程与进程之间是相互隔离互不影响的,拥有自己的独立空间,一个进程拥有多个线程,二线程与线程之间是共享虚拟空间和静态资源等的,这就导致当多个线程共享同一个资源的时候,会出现数据安全,资源冲突线程线程,而线程同步这个机制的出现就是为了解决这一问题的
当多线程共享统一资源不设置线程同步的时候例如下:

public class Account implements Runnable {
   
    private static int num;
    @Override
    public void run() {
   
        try {
   
            Thread.currentThread().sleep(1);
        } catch (InterruptedException e) {
   
            e.printStackTrace();
        }
        num++;
        System.out.println(Thread.currentThread().getName()+"是第"+num+"位访客");
    }
}
public class Test1 {
   
    public static void main(String[] args) {
   
        Account account = new Account();
        Thread threadA = new Thread(account,"A线程");
        Thread threadB = new Thread(account,"B线程");
        threadA.start();
        threadB.start();
    }
}
B线程是第2位访客
A线程是第2位访客

分析以上问题我们会发现,A、B两个线程共享num这一个静态数据,正常情况下这个输出结果应该是一个线程是第1位访客,一个线程是第2为访客,但是结果却都是第2位访客,这就与我们的意愿背道而驰,为什么会出现这种情况呢?当B线程获取的cpu的时候会进入到run方法然后num++,这时候num是1,但是当他还没有输出结果的时候A线程进来了,也进行了一次num++,这时候num变成了2,这是后B才输出,所以结果是2,A线程输出的num也是2,这就导致了数据错误。所以为了避免这种问题的发生,我们要保证一个线程在操作共享资源的时候,其他线程不能对这个贡献资源进行操作,这就用到了线程同步。

解决方案
在方法上加synchronized关键字来修饰方法实现线程同步,每一个java对象都有一个内置锁,内置锁会保护被synchronized修饰的方法不被其他线程所访问,要进入这个方法就必须拥有这个内置锁,否则就会处于阻塞状态。
一下是synchronized修饰对象方法:

public class Account implements Runnable {
   
    private static int num;
    @Override
    public synchronized void run() {
   
        System.out.println("当前对象是"+this);
        try {
   
            Thread.currentThread().sleep(1);
        } catch (InterruptedException e) {
   
            e.printStackTrace();
        }
        num++;
        System.out.println(</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值