多线程下synchronized修饰static方法与非static方法的区别
来源:互联网 发布:淘宝网买什么 编辑:程序博客网 时间:2024/05/21 11:09
代码如下:
执行完发现,i并没有如想像中的输出1000,即使i添加volatile进行修饰,也不会输出1000,值是随机变化的。
将inc()方法添加static修饰,结果无问题,准确无误的输出1000。
另外一种改法,将代码改成:
修改成:结果无问题,准确无误的输出1000这里主要涉及到类对象(static方法),对象方法(非static方法)
我们知道,当synchronized修饰一个static方法时,多线程下,获取的是类锁(即Class本身,注意:不是实例);
当synchronized修饰一个非static方法时,多线程下,获取的是对象锁(即类的实例对象)
所以,当synchronized修饰一个static方法时,创建线程不管是new JoinThread()还是new Thread(new JoinThread()),在run方法中执行inc()方法都是同步的;
相反,当synchronized修饰一个非static方法时,如果用new JoinThread()还是new Thread(new JoinThread())方式创建线程,就无法保证同步操作,因为这时
inc()是属于对象方法,每个线程都执有一个独立的对象实例new JoinThread(),所以多线程下执行inc()方法并不会产生互斥,也不会有同步操作。
另外如果考虑到变更的原子操作,可使用atomic包下面的包装对象,这些对象都是对volatile修饰变量的一种延伸,可保证变量的原子操作而不用去同步方法或
代码块是否同步。
阅读全文
0 0
- 多线程下synchronized修饰static方法与非static方法的区别
- 多线程下synchronized修饰static方法与非static方法的区别
- synchronized修饰static方法与非static方法的区别
- synchronized修饰非static方法与修饰static方法的区别
- Java语言中synchronized 修饰在 static方法和 非static方法的区别
- synchronized 修饰在 static方法和 非static方法的区别
- synchronized 修饰在 static方法和非static方法的区别
- Java中synchronized 修饰在 static方法和 非static方法的区别
- Java中synchronized 修饰在static方法和非static方法的区别
- Java多线程之Synchronized应用在static和非static方法上的区别
- 多线程synchronized和synchronized static方法的区别
- Java中static修饰的方法和非static修饰的方法的区别
- java中synchronized修饰的方法或代码块和static synchronized修饰方法或代码块的区别
- java static块和static方法及static方法和非static方法的区别
- abstract的方法 与 static/native/synchronized
- static方法和非static方法的区别(java)
- synchronized关键字加到static静态方法和非static静态方法区别
- 【Java】static方法与非static方法
- MySQL5.7 虚拟列实现表达式索引
- Google's BigTable 原理 (翻译)
- 斐波那契数--递归和非递归实现
- 【转载】JSP会话跟踪学习记录
- markdown中如何设置图片的显示大小
- 多线程下synchronized修饰static方法与非static方法的区别
- java中配置path和CLASSPATH的意义
- 内存中常见异常值的解释(比如0xcccccccc、0xcdcdcdcd和 0xfeeefeee 异常值 )
- 梯度下降法
- phaser 如何跳过开始场景,直接进入动画 (5)
- Android---碎片的生命周期
- visual attention
- cocos2d-iphone编译
- EasyNVR H5无插件摄像机直播解决方案前端解析之:监控实时直播的四分屏的前端展示