在java中我们可以使用“同步”来解决线程同步的问题。该关键字可以保证多线程并发情况下的线程安全。
package com.buydeem.share;
public class WaitNotifyDemo1 {
静态 final 对象锁= new Object();
静态 整数= 0;
公共 静态 void main(String [] args) 抛出InterruptedException{
可运行 可运行 = () -> {
for (int i = 0; i < 1000; i++) { 已同步(锁定){
数字++ ;
System.out.printf("线程:[%s]打印编号:[%d]%n",Thread.currentThread().getName(),number);
}
}
};
线程 t1 = 新 线程(可运行);
t1.setName("t1");
主题t2 = 新 线程(可运行);
t2.setName("t2");
t1.start();
t2.start();
t1.join();
t2.join();
}
}
例如上面的示例代码中,我们使用synchronized关键字来同步线程,最终打印的结果是2000。(如果你不太理解上面的代码,建议不要浪费时间看这篇文章,阅读之前可以先了解synchronized。关注公众号查看《多线程》专题。)
上面的例子中,线程安全问题已经解决了,但是还有一个问题没有解决,就是线程之间的协调问题。那么什么是协调问题呢?如果我现在加一个需求,这个需求不仅是为了保证线程安全,也是为了让两个线程交替打印结果。要完成此任务,您必须允许线程进行通信并协调它们的工作。这是之前对协调的定义。
对于上面的问题,我们可以使用wait和notify来解决。这里我先给出实现代码,稍后我们再详细分析。
公共 类 WaitNotifyDemo2 {
静态 最终对象锁定= 新 对象();
静态 整数 = 0;
公共 静态 空白 main(String[] args) 抛出 InterruptedException {
可运行可运行 = () -> { 对于( int i = 0; i < 1000; i++) {
同步(锁定){
LOCK.notify();
number++;
System.out.printf("线程:[%s]打印编号:[%d]%n",Thread.currentThread().getName(),number);
尝试 {
LOCK.wait();
} catch(已中断例外 e) {
e.printStackTrace();
}
}
}
};
线程 t1 = 新 线程(可运行);
t1.setName("t1");
t1。 t2.setName("t2");
t1.start();
t2.start();
t1.join();
}
}
如上所示修改代码,然后运行代码打印整个结果如下: