120-同步代码块以及同步方法之间的区别和关系
synchronized关键字同步方法的使用
代码:
// 单线程运行synchronized方法里边的内容
@Override
public synchronized void run() {
while (true) {
// 1
if (index > MAX) {
break;
}
try {
Thread.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " 的号码是:" + (index++));
// 2
}
}
运行结果:只有线程t1运行并输出信息。
分析:三个线程同时去争抢synchronized的方法锁,此时线程t1争抢到锁然后进入同步方法运行程序,一直到运行完成;然后线程t2争抢到锁并进入同步方法,但是此时index > MAX
只能跳出程序。线程t3亦是如此。
注:同步代码块的锁为LOCK锁;同步方法的锁为this锁
此时,应该如何使用synchronized同步方法来实现同步运行呢?
@Override
public void run() {
while (true) {
if (ticket()) {
break;
}
}
}
private synchronized boolean ticket() {
// 1. getField
if (index > MAX) {
return true;
}
Thread.sleep(5);
// index++; => index = index + 1;
// 1. get Field index.
// 2. index = index + 1;
// 3. put Field index.
System.out.println(Thread.currentThread().getName() + " 的号码是:" + (index++));
return false;
}
private boolean ticket2() {
synchronized (this) {
if (index > MAX) {
return true;
}
try {
Thread.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " 的号码是:" + (index++));
return false;
}
}
使用同步代码块的原则:使用synchronized关键字应尽量小地给共享数据加锁
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 tuyrk@qq.com
文章标题:120-同步代码块以及同步方法之间的区别和关系
文章字数:318
本文作者:神秘的小岛岛
发布时间:2019-11-24, 17:59:20
最后更新:2019-11-24, 18:39:11
原始链接:https://www.tuyrk.cn/wang-thread/120-sync-codeblock-method/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。