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

解答:

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

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

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

时间: 2024-08-04 06:57:35

每天一道Java题[11]的相关文章

每天一道Java题[3]

问题 为什么在重写equals()方法的同时,必须重写hashCode()方法? 解答 在<每天一道Java题[2]>中,已经对hashCode()能否判断两个对象是否相等做出了解释.equals()方法与hashCode()方法的关系如下: 如果两个对象的hashCode()返回值不一样,则equals()返回的结果必为false. 如果两个对象的hashCode()返回值一样的时候,equals()返回的结果未知. 如果两个对象的equals()返回的结果为true,则两个对象的hashC

每天一道Java题[9]

题目 native关键字的作用是什么? 解答 首先,需了解JNI(Java Native Interface),它是连接Java平台与本地C代码的一个API. 其次,用native关键字声明的方法,是告诉JVM调用的方法是一个外部定义的方法,也就是本地C代码定义的一个方法. 总结来说,native关键字的具体作用是,用它声明的方法,并不需要Java代码自己实现.而是JVM通过JNI来加载本地系统C/C++的DLL,然后调用其中的方法来实现. 发散思维 1.说一下,我们平时用到的哪个方法,是用na

每天一道Java题[6]

题目 String字符串怎么转换为Date,Date又怎么转换成String字符串 解答 String->Date 主要用到类SimpleDateFormat及其抽象父类DateFormat中的方法parse(). 如下: String dateStr = "2017-05-18 16:00:00"; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date =

每天一道Java题[1]

问题:char[]与String相比,有什么优胜的地方? 回答: 针对安全保密高的信息,char[]比String做得更好.因为String是不可变得,即使你修改原先的变量,实际上也是在内存中新建一个对象,原数据还是保留在内存中,等待回收.而char[]中的元素是可以更改的.这就意味着,如密码等保密信息用完之后,你可以马上修改它而不能痕迹.从而相对于String有更好的安全性.可从下面例子中看出,char[]变更内容后,仍是那个对象.而String已经不是原来的String了. 引用: 这个对比

每天一道Java题[10]

题目 阐述创建线程最常用的两种方法及其对比. 解答 方法一:继承Thread类实现 步骤: 创建Thread类的子类,如MyThread. 重写Thread类的run()方法. 实例化MyThread类,对象名如myThread. 运用Thread类的start()方法启动线程,如myThread.start(). 方法二:实现Runnable接口 步骤: 创建一个类,如MyRunnableThread,实现Runnable接口. 创建MyRunnableThread类的对象. 实例化Threa

每天一道Java题[5]

题目 String.StringBuilder.StringBuffer有什么异同? 解答 相同点:String.StringBuilder.StringBuffer都可以用来存储字符串. 不同点: 1.String与StringBuilder.StringBuffer的不同点主要在于,String对象创建之后,是不可改变的,平时我们对同一个String变量赋值,实际上是创建了个新的对象.而后两者是可变的,这意思就是说,他们可以在同一内存地址上更改它的值,而无需创建新的对象. 2.StringB

每天一道Java题[8]

以下题目及解答属于个人见解,欢迎大家也分享和补充一下解答的内容,互相促进,共同进步! 题目 RESTful WebService与SOAP WebService有什么异同? 解答 SOAP是一个协议,而REST实际上是一个互联网软件的架构原则,并不是一个协议.它更像是对Http协议的设计初衷作诠释. SOAP发展到现在,相对REST来说,已经有相当的成熟度. SOAP WebService对于消息体.消息头等内容有统一的规范,通用性相对更强.而RESTful WebSerivce实际上只是一个设

每天一道Java题[7]

题目 什么是REST原则,请解释RESTful架构,以及其设计思想? 解答 REST,全称为Representation State Transfer,是一种互联网软件的架构原则.凡是满足REST原则的,我们都称它为RESTful架构. 对RESTful架构的理解,有以下几点: 资源,网络上的一个实体,或者是一个具体的信息.通常使用一个URI来表示一种资源. Representation,可理解为资源的表现层,资源的具体表现形式.在http请求的头信息Accept和Content-Type字段指

每天一道Java题[2]

问题 可以直接根据hashCode()方法产生的值判断两个对象是否相等吗? 解答 不能!根据Wikipedia(https://en.wikipedia.org/wiki/Java_hashCode())上对hashCode()方法的解释,它会根据这个对象内存储的数据及对象的一些特征来做散列,并返回一个有符号的32位哈希值.从这解释我们就可以看到,hashCode()方法返回的是一个散列值,而对于一个散列来说,不同的内容也是可能会出现相同的散列值的.所以即使两个对象的hashCode()返回的值