码迷,mamicode.com
首页 > 编程语言 > 详细

每天一道Java题[11]

时间:2017-05-28 00:25:24      阅读:298      评论:0      收藏:0      [点我收藏+]

标签:线程同步   class   同步锁   function   log   archive   实例   htm   logs   

题目

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,那它怎么获取同步锁?

解答:

  1. 对于实例的同步方法,使用this,即当前实例对象作为同步锁。
  2. 对于静态的同步方法,使用当前类的字节码对象。

   

2.对于方法一,如果每次传给synchronized的都是新对象,能否实现同步的效果?

解答:不能。因为不同的线程对应不同的同步锁,不具有排他性,故线程同步会失效。

   

每天一道Java题[11]

标签:线程同步   class   同步锁   function   log   archive   实例   htm   logs   

原文地址:http://www.cnblogs.com/huangzijian/p/6914733.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!