如何解决多线程时的数据同步问题
一个字 锁
Java是为数不多可以执行多线程的语言
前几天做了 Java对于多线程的基本操作 但是 多个线程 对同一个资源访问的时候 肯定会出现数据不同步的问题
**synchronized **关键字
synchronized() {
//synchronized 代码块
}
举例一个简单的抢票操作
package com.xiaowang;
class Mythread implements Runnable {
private Integer ticket = 100;
@Override
public void run() {
while (true) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (ticket>0) {
System.out.println(Thread.currentThread().getName()+"这票还有:"+ticket --);
}
}
}
}
class test {
public static void main(String args[]) {
Mythread mt = new Mythread();
new Thread(mt,"抢票的A:").start();
new Thread(mt,"抢票的B:").start();
new Thread(mt,"抢票的C:").start();
}
}
执行结果
抢票的A:这票还有:15
抢票的C:这票还有:15
抢票的B:这票还有:14
抢票的B:这票还有:13
抢票的C:这票还有:13
抢票的A:这票还有:12
抢票的A:这票还有:11
抢票的B:这票还有:11
抢票的C:这票还有:11
抢票的A:这票还有:10
抢票的C:这票还有:10
抢票的B:这票还有:10
抢票的B:这票还有:9
抢票的A:这票还有:9
抢票的C:这票还有:9
抢票的A:这票还有:8
抢票的B:这票还有:6
抢票的C:这票还有:7
抢票的A:这票还有:5
抢票的B:这票还有:4
抢票的C:这票还有:4
抢票的C:这票还有:3
抢票的A:这票还有:2
抢票的B:这票还有:1
太长了 缩短一点从20票以后来看
会发现 数据并不同步
添加刚刚说的关键字 再查看效果
代码
package com.xiaowang;
class Mythread implements Runnable {
private Integer ticket = 100;
@Override
public void run() {
while (true) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}synchronized (this) { //只允许 一个进程
if (ticket>0) {
System.out.println(Thread.currentThread().getName()+"这票还有:"+ticket --);
}
}
}
}
}
class test {
public static void main(String args[]) {
Mythread mt = new Mythread();
new Thread(mt,"抢票的A:").start();
new Thread(mt,"抢票的B:").start();
new Thread(mt,"抢票的C:").start();
}
}
执行效果
抢票的B:这票还有:39
抢票的A:这票还有:38
抢票的B:这票还有:37
抢票的C:这票还有:36
抢票的A:这票还有:35
抢票的A:这票还有:34
抢票的C:这票还有:33
抢票的B:这票还有:32
抢票的C:这票还有:31
抢票的A:这票还有:30
抢票的B:这票还有:29
抢票的C:这票还有:28
抢票的B:这票还有:27
抢票的A:这票还有:26
抢票的A:这票还有:25
抢票的B:这票还有:24
抢票的C:这票还有:23
抢票的C:这票还有:22
抢票的A:这票还有:21
抢票的B:这票还有:20
抢票的C:这票还有:19
抢票的B:这票还有:18
抢票的A:这票还有:17
抢票的B:这票还有:16
抢票的C:这票还有:15
抢票的A:这票还有:14
抢票的A:这票还有:13
抢票的C:这票还有:12
抢票的B:这票还有:11
抢票的C:这票还有:10
抢票的A:这票还有:9
抢票的B:这票还有:8
抢票的C:这票还有:7
抢票的B:这票还有:6
抢票的A:这票还有:5
抢票的C:这票还有:4
抢票的A:这票还有:3
抢票的B:这票还有:2
抢票的A:这票还有:1
截取一些
但是 数据同步会导致运行速度变慢
异步操作才能得到性能的提升
也可利用同步方法
在方法定义上 用synchronized 关键字
上代码
package com.xiaowang;
class Mythread implements Runnable {
private Integer ticket = 100;
public synchronized boolean seal() {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (ticket > 0) {
System.out.println(Thread.currentThread().getName() + "这票还有:" + ticket--);
return true;
} else
System.out.println("没票了");
return false;
}
@Override
public void run() {
while (this.seal()) {
;
}
}
}
class test {
public static void main(String args[]) {
Mythread mt = new Mythread();
new Thread(mt, "抢票的A:").start();
new Thread(mt, "抢票的B:").start();
new Thread(mt, "抢票的C:").start();
}
}
数据同步 一定会导致运行效率变慢