题目

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]的更多相关文章

  1. 每天一道Java题[3]

    问题 为什么在重写equals()方法的同时,必须重写hashCode()方法? 解答 在<每天一道Java题[2]>中,已经对hashCode()能否判断两个对象是否相等做出了解释.eq ...

  2. 每天一道Java题[4]

    问题 怎么将字符串转换为int? 解答 此题看似简单,但经常出现在笔试等地方,由于大家习惯了用IDE,有什么还真未必能写出来.通常都是parseInt()方法进行转换,如下: Int n = Inte ...

  3. 每天一道Java题[6]

    题目 String字符串怎么转换为Date,Date又怎么转换成String字符串 解答 String->Date 主要用到类SimpleDateFormat及其抽象父类DateFormat中的 ...

  4. 每天一道Java题[9]

    题目 native关键字的作用是什么? 解答 首先,需了解JNI(Java Native Interface),它是连接Java平台与本地C代码的一个API. 其次,用native关键字声明的方法,是 ...

  5. 每天一道Java题[1]

    问题:char[]与String相比,有什么优胜的地方? 回答: 针对安全保密高的信息,char[]比String做得更好.因为String是不可变得,即使你修改原先的变量,实际上也是在内存中新建一个 ...

  6. 每天一道Java题[2]

    问题 可以直接根据hashCode()方法产生的值判断两个对象是否相等吗? 解答 不能!根据Wikipedia(https://en.wikipedia.org/wiki/Java_hashCode( ...

  7. 每天一道Java题[5]

    题目 String.StringBuilder.StringBuffer有什么异同? 解答 相同点:String.StringBuilder.StringBuffer都可以用来存储字符串. 不同点: ...

  8. 每天一道Java题[7]

    题目 什么是REST原则,请解释RESTful架构,以及其设计思想? 解答 REST,全称为Representation State Transfer,是一种互联网软件的架构原则.凡是满足REST原则 ...

  9. 每天一道Java题[10]

    题目 阐述创建线程最常用的两种方法及其对比. 解答 方法一:继承Thread类实现 步骤: 创建Thread类的子类,如MyThread. 重写Thread类的run()方法. 实例化MyThread ...

随机推荐

  1. IE和其他浏览器用JS新窗口打开的问题

    Chrome中 window.open(pageURL,name,parameters) pageURL 为子窗口路径 name 为子窗口句柄 parameters 为窗口参数(各参数用逗号分隔) 例 ...

  2. ASP.NET MVC5请求管道和生命周期

    请求处理管道 请求管道是一些用于处理HTTP请求的模块组合,在ASP.NET中,请求管道有两个核心组件:IHttpModule和IHttpHandler.所有的HTTP请求都会进入IHttpHandl ...

  3. 物理提取大绝招”Advanced ADB”???

    近来手机取证有个极为重大的突破,是由手机取证大厂Cellebrite所率先发表的"Advanced ADB" 物理提取方法,此功能已纳入其取证设备产品UFED 6.1之中. 这个所 ...

  4. Java多线程的几个常用关键字

    一.同步(synchronized)和异步(asynchronized) 1.同步(synchronized)简单说可以理解为共享的意思,如果资源不是共享的,就没必要进行同步.设置共享资源为同步的话, ...

  5. git 利用分支概念实现一个仓库管理两个项目

    需求描述:开发了一个网站,上线之际,突然另一个客户说也想要个一样的网站,但网站的logo和内部展示图片需要替换一下,也就是说大部分的后台业务逻辑代码都是一致的,以后升级时功能也要保持一致:刚开始想反正 ...

  6. Display:table;妙用,使得左右元素高度相同

    我们在设计网页的时候,为了左右能够分明一点,我们经常会在左边元素弄一个border-right,但是出现一个问题,如果左边高度比较小,这根线就短了,下面空了一部分,反正如果在右边的元素弄一个borde ...

  7. cmd 菜单学习

    @ECHO OFF&PUSHD %~DP0 &TITLE 标题是随意的 mode con cols=36 lines=20 color 2C :menu cls echo. echo ...

  8. 被低估的选手 - JavaFx

    被低估的选手 - JavaFx 1.MFC(Visual C++) 个人不是很喜欢这个框架,太多系统定义的东西,就像无底洞,学都学不完,这个东西需要你有比较强的记忆力,并且能融会贯通里面很多预定义的功 ...

  9. js算法集合(一) 水仙花数 及拓展(自幂数的判断)

    js算法集合(一) ★ 最近有些朋友跟我说对js中的一些算法感到很迷惑,知道这个算法到底是怎么回事,但是就是不会用代码把它写出来,这里我跟大家分享一下做水仙花数的算法的思路,并对其扩展到自幂数的算法, ...

  10. Maven学习-Profile详解

    Profile能让你为一个特殊的环境自定义一个特殊的构建:profile使得不同环境间构建的可移植性成为可能.Maven中的profile是一组可选的配置,可以用来设置或者覆盖配置默认值.有了prof ...