首页 > 代码库 > 每天一道Java题[11]
每天一道Java题[11]
题目
synchronized怎么实现线程同步?请修改《每天一道Java题[10]》中的MyRunnableThread类以解决三个线程都获取到10的问题。
解答
方法一:
采用synchronized关键字包裹需要保证线程安全的代码块,来实现线程同步。语法格式为:
Synchronized(expression){ //需同步的代码 }
《每天一道Java题[10]》中的MyRunnableThread类修改为:
package me.huangzijian; public class MyRunnableThread implements Runnable { private int num = 10; private Object obj = new Object(); @Override public void run() { int count = num; for (int i = 0; i < count; i++) { synchronized (obj) { System.out.println(Thread.currentThread().getName() + ":" + num); num--; } } } }
方法二:
采用synchronized关键字来修饰方法,从而用整个方法来进程线程同步。语法格式为:
public synchronized void function(){ //方法代码 }
《每天一道Java题[10]》中的MyRunnableThread类修改为:
package me.huangzijian; public class MyRunnableThread implements Runnable { private int num = 10; private Object obj = new Object(); @Override public synchronized void run() { int count = num; for (int i = 0; i < count; i++) { System.out.println(Thread.currentThread().getName() + ":" + num); num--; } } }
发散思维
1.synchronized关键字修饰方法,没有expression,那它怎么获取同步锁?
解答:
- 对于实例的同步方法,使用this,即当前实例对象作为同步锁。
- 对于静态的同步方法,使用当前类的字节码对象。
2.对于方法一,如果每次传给synchronized的都是新对象,能否实现同步的效果?
解答:不能。因为不同的线程对应不同的同步锁,不具有排他性,故线程同步会失效。
每天一道Java题[11]
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。