题目
synchronized 怎么实现线程同步?请修改《每天一道 Java 题 [10]》中的 MyRunnableThread 类以解决三个线程都获取到 10 的问题。
解答
方法一:
采用 synchronized 关键字包裹需要保证线程安全的代码块,来实现线程同步。语法格式为:
- Synchronized(expression){
- //需同步的代码}
《每天一道 Java 题 [10]》中的 MyRunnableThread 类修改为:
- package me.huangzijian;
- public classMyRunnableThreadimplements Runnable {
- private intnum = 10;
- privateObject obj =new Object();
- @Override
- public void run() {
- intcount = num;
- for(inti = 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 classMyRunnableThreadimplements Runnable {
- private intnum = 10;
- privateObject obj =new Object();
- @Override
- public synchronized void run() {
- intcount = num;
- for(inti = 0; i < count; i++) {
- System.out.println(Thread.currentThread().getName() + ":" + num);
- num--;
- }
- }
- }
发散思维
1.synchronized 关键字修饰方法,没有 expression,那它怎么获取同步锁?
解答:
2. 对于方法一,如果每次传给 synchronized 的都是新对象,能否实现同步的效果?
解答:不能。因为不同的线程对应不同的同步锁,不具有排他性,故线程同步会失效。
来源: http://www.cnblogs.com/huangzijian/p/6914733.html