/*
* 利用synchronize进行线程同步,访问稀缺资源,同一时刻只能一个线程访问关键资源,刷新资源状态;
*
* task:10个人抢着通过1个山洞,每个人穿山洞耗时1s;
* 1)打印出穿越山洞的人,并显示它是通过的次序,名称
* */
public class threadSync0105 {
//通过runable接口重写来实现,synchronize(this)同步
//new runable接口传递给10个新建的线程, runable overwrite
public static void main(String[] args){
Runnable ri = new Runnable() {
private int cnt = 1;
@Override
public void run() {
synchronized (this) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
new print2().print(Thread.currentThread().getName() + " 通过山洞,他是第" + cnt);
cnt ++;
}
}
};
for (int i = 0; i < 10; i ++) {
new Thread(ri, "线程" + i).start();
}
}
}
class print2{
public void print(String str) {
System.out.println(str);
}
}
results:
线程0 通过山洞,他是第1
线程8 通过山洞,他是第2
线程7 通过山洞,他是第3
线程9 通过山洞,他是第4
线程6 通过山洞,他是第5
线程5 通过山洞,他是第6
线程4 通过山洞,他是第7
线程2 通过山洞,他是第8
线程1 通过山洞,他是第9
线程3 通过山洞,他是第10
Process finished with exit code 0
- 所谓“同步”翻译自“synchronize”名称,意思是多核程序的可见性、原子性和保序性导致的关键资源状态、更新问题;需要改并发程序为展示的“串行”方式;
- 同步意思实际是非并发态,独占式访问,为了运行安全暂时牺牲效率。一个个线程轮流运行(尽管多线程下这个次序是竞争性,不确定的)

本文介绍了一个使用synchronize关键字实现线程同步的经典案例。通过模拟10个人依次通过狭窄山洞的过程,演示了如何确保同一时刻只有一个线程可以访问稀缺资源。每个线程通过山洞时会打印出其名称及通过顺序。
1216

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



