测试代码如下:

 public class SyncNonFinalField {
private Object object = new Object();
public void start() { new Thread(new Runnable() { @Override
public void run() {
System.out.println("线程1等待锁");
synchronized (object) {
System.out.println("线程1获取到了锁");
object = new Object();
System.out.println("线程1准备sleep");
try {
Thread.sleep(5000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程1 sleep结束");
}
}
}).start(); new Thread(new Runnable() { @Override
public void run() {
try {
Thread.sleep(1000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程2等待锁");
synchronized (object) {
System.out.println("线程2获取到了锁");
}
}
}).start();
}
}

输出结果:

线程1等待锁
线程1获取到了锁
线程1准备sleep
线程2等待锁
线程2获取到了锁
线程1 sleep结束
 
也就是说,在线程1的同步块中,只要一给object重新赋值,线程2立即就进入到了同步块中
 
分析:
synchronized (object) 锁的是object这个引用所指向的对象,而不是锁引用。
线程1 sleep 时,并没有释放旧对象的锁。
但它让 object 指向了一个新对象之后,线程2就立即获取到了新对象的锁,所以线程2进入到了同步块中。
 
解决办法:
用final修饰object,避免它在同步块中被重新赋值。

android studio 警告 synchronization on non-final field的更多相关文章

  1. android studio class org.bouncycastle.asn1.asn1primitive overrides final method equals

    好吧 上手as 又遇到一个问题: class org.bouncycastle.asn1.asn1primitive overrides final method equals... 项目运行的是后报 ...

  2. Android Studio 打开弹出警告框

    1.Android Studio打开后,自己的项目没有打开,就弹出了警告框,重启之后依然弹出警告框: 警告框内容:"Cannot load project: java.lang.Illega ...

  3. Android Studio 中提示 Private field 'mType' is assigned but never accessed 的原因

    Android Studio 是个很酷的编译器,之前发现有个代码提示很奇怪,但无奈一直没看懂他的意思,不过也没报错就没太在意,刚刚突然领悟了,原来是自己代码不规范. Private field 'mT ...

  4. Android Studio升级到3.1.4后打开旧项目警告:The `android.dexOptions.incremental` property is deprecated and it has no effect on the build process.

    现象截图 问题原因&解决方案 在build.gralde中,对Android开发过程中突破的方法数的限制,做了如下解决配置: dexOptions { incremental true jav ...

  5. Android Studio编译OsmAnd出现警告:GeoPointParserUtil.java使用或覆盖了已过时的 API。有关详细信息请使用-Xlint:deprecation重新编译

    [背景] 之前折腾: [记录]Android Studio中导入OsmAnd并编译 期间,遇到了编译警告: 1 2 3 4 5 :OsmAnd-java:compileJava 注: E:\crifa ...

  6. Android项目实战(二十五):Android studio 混淆+打包+验证是否成功

    前言: 单挑Android项目,最近即时通讯用到环信,集成sdk的时候 官方有一句 在 ProGuard 文件中加入以下 keep. -keep class com.hyphenate.** {*;} ...

  7. Android studio混淆

    看了一篇关于Android studio混淆的文章http://blog.csdn.net/qq_23547831/article/details/51581491,感觉有必要总结一个简单的混淆版本设 ...

  8. android studio 实现代码混淆

    =======本文章属于转载==========原文章地址:http://my.oschina.net/aibenben/blog/370985 这篇文章等是跟大家分享一在Android studio ...

  9. Android Studio 代码混淆

    新建一个项目,Android Studio默认关闭代码混淆开关,在build.gradle文件中,如下图所示的minifyEnabled 开关,因此如果需要混淆代码,需将false改为true,然后在 ...

随机推荐

  1. 怎样用css来美化一个html页面

    # 转载请留言联系 我们都知道html写出来的东西是一个文本内容,很单调.和我们平时刷网页看到的内容不一样.那普通的网页是怎样对html超文本进行装饰的呢?没错,就是CSS. css的基本语法 选择器 ...

  2. 【C++】类的特殊成员变量+初始化列表

    参考资料: 1.黄邦勇帅 2.http://blog.163.com/sunshine_linting/blog/static/448933232011810101848652/ 3.http://w ...

  3. Selenium2+python自动化68-html报告乱码问题【转载】

    前言 python2用HTMLTestRunner生成测试报告时,有中文输出情况会出现乱码,这个主要是编码格式不统一,改下编码格式就行. 下载地址:http://tungwaiyip.info/sof ...

  4. Selenium2+python自动化66-装饰器之运行失败截图【转载】

    前言 对于用例失败截图,很多小伙伴都希望在用例执行失败的时候能自动截图,想法是很好的,实现起来并不是那么容易. 这里分享下我的一些思路,当然目前还没找到完美的解决方案,我的思路是用装饰器去解决,希望有 ...

  5. Python 进阶 之 else块 巧(慎)用

    Python 的 else 模块和其他语言的else模块相比有那么一丢丢的特殊用法,有些用法虽然不推荐用,但是别人如果用了,最起码能看懂是不是? 1:快捷返回值: 格式: value1 if expr ...

  6. laravel自定义公共函数

    1.在app/Helpers/下新建一个文件functions.php,当然这个文件位置和名称你可以自己定义,创建一些函数用于全局调用: 2.在composer.json中的autoload下增加如下 ...

  7. Redis 源码走读(一)事件驱动机制与命令处理

    eventloop 从 server.c 的 main 方法看起 int main(int argc, char **argv) { ....... aeSetBeforeSleepProc(serv ...

  8. EasyUI----DataGrid行明细增删改操作

    http://blog.csdn.net/huchiwei/article/details/7787947   本文实现的是EasyUI-DataGrid行明细的增删改操作.具体参考来自以下文章: 官 ...

  9. 拓扑排序(Topological Order)UVa10305 Ordering Tasks

    2016/5/19 17:39:07 拓扑排序,是对有向无环图(Directed Acylic Graph , DAG )进行的一种操作,这种操作是将DAG中的所有顶点排成一个线性序列,使得图中的任意 ...

  10. Python与数据结构[3] -> 树/Tree[2] -> AVL 平衡树和树旋转的 Python 实现

    AVL 平衡树和树旋转 目录 AVL平衡二叉树 树旋转 代码实现 1 AVL平衡二叉树 AVL(Adelson-Velskii & Landis)树是一种带有平衡条件的二叉树,一棵AVL树其实 ...