目录
线程同步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

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

被折叠的 条评论
为什么被折叠?



