线程安全(数据同步synchronized,Lock锁)

本文通过银行取钱的例子介绍了Java中线程安全问题,探讨了synchronized关键字和Lock锁的使用。首先,展示了未使用同步机制时出现的数据不一致问题,然后逐步引入synchronized同步代码块和同步方法解决线程安全,最后提到了线程安全类如StringBuffer、Vector和Hashtable,并简单介绍了JDK5引入的Lock接口及其实现类ReentrantLock,强调了正确释放锁的重要性。

目录

线程同步synchronized

Lock锁


线程同步synchronized

我们先看一个例子,假设去银行取钱,原始钱为20,每次只取1元,有3个人分别同时去取

package com.Thread;

/**
 * @author 林高禄
 * @create 2020-05-14-15:43
 */
public class Test1 implements Runnable {
    private int a = 20;
    private boolean b = true;

    @Override
    public void run() {
        while (b) {
            if (a > 0) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + "a的结果" + a);
                a--;
            } else {
                b = false;
            }
        }

    }
}
package com.Thread;

/**
 * @author 林高禄
 * @create 2020-05-14-15:42
 */
public class SynchronizedDemo {
    public static void main(String[] args) {
        Test1 te = new Test1();
        Thread t1 = new Thread(te,"线程1");
        Thread t2 = new Thread(te,"线程2");
        Thread t3 = new Thread(te,"线程3");

        t1.start();
        t2.start();
        t3.start();
    }
}

我们多开了3个线程,共享数据a,每执行以下,a--

输出结果:

线程2a的结果20
线程3a的结果19
线程1a的结果19
线程2a的结果17
线程1a的结果16
线程3a的结果16
线程2a的结果14
线程3a的结果13
线程1a的结果13
线程2a的结果11
线程1a的结果10
线程3a的结果9
线程2a的结果8
线程3a的结果7
线程1a的结果7
线程2a的结果5
线程1a的结果4
线程3a的结果4
线程2a的结果2
线程3a的结果1
线程1a的结果0
线程2a的结果-1

从结果中,我们看到不仅有相同的a数值输出,还出现了0和-1,这就引发除了线程数据安全问题。

为什么出现问题?(这也是我们判断多线程程序是否会有数据安全问题的标准)

  • 是否是多线程环境
  • 是否有共享数据
  • 是否有多条语句操作共享数据

如何解决多线程安全问题呢?

  • 基本思想:让程序没有安全问题的环境

怎么实现呢?

  • 把多条语句操作共享数据的代码给锁起来,让任意时刻只能有一个线程执行即可
  • Java提供了同步代码块的方式解决
  • 格式

          &nbs

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林高禄

你打不打赏,我都会一直写博客

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值