1.Synchronized关键字使用


class X {
// 修饰非静态方法
synchronized void foo() {
// 临界区
}
// 修饰静态方法
synchronized static void bar() {
// 临界区
}
// 修饰代码块
Object obj = new Object();
void baz() {
synchronized(obj) {
// 临界区
}
}
}

说明:

修饰静态方法时,锁定的是当前类的Class对象,在例子中就是X.class

修饰非静态方法时,锁定的是当前的实例对象this

修饰代码块时,锁定的是obj对象

2.Java中的原子性问题

一个或多个操作在cpu执行过程中,不被中断的特性,称为“原子性”

原子性问题的根源是发生了线程切换,如果禁用线程切换,就可以解决原子性的问题

在同一时刻只有一个线程执行,非常重要

临界区:一段需要互斥的代码


class SafeCalc {
long value = 0L;
long get() {
return value;
}
synchronized void addOne() {
value += 1;
}
}

这样代码,addOne就解决了原子性问题,而根据一项happen-fore原子,管程中所的解锁操作happens-before与后续对这个所的加锁

  • 线程A执行完addOne操作后,线程B再执行addOne时候,是能看到value被加1的结果的,能看到此时value 已经是1了

get()方法会有可见性问题么?

  • 这个是没法保证的,happens-before规则中,保证了后续对这个锁的加锁的可见性,get()方法没有加锁操作。可见性没法保证。
  • 如何保证可见性,则get方法也用synchronized修饰一下就好了

synchronized使用及java中的原子性问题的更多相关文章

  1. Android多线程研究(8)——Java中的原子性理解

    一.什么是原子性 原子性是世界上最小单位,具有不可分割性.比如a=0;(a非long和double类型)这个操作是不可分割的,那么我们说这个操作是原子操作.再比如:a++;这个操作实际上是a=a+1; ...

  2. 为什么Java中 wait 方法需要在 synchronized 的方法中调用?

    另一个棘手的核心 Java 问题,wait 和 notify.它们是在有 synchronized 标记的方法或 synchronized 块中调用的,因为 wait 和 modify 需要监视对其上 ...

  3. 从同步原语看非阻塞同步以及Java中的应用

    非阻塞同步:基于冲突检测的乐观并发策略,通俗讲就是先进行操作,如果没有其他线程争用共享数据,那操作就成功了,如果争用数据有冲突那就采用其他的补偿措施(最常见的就是不断重试直到成功),这种乐观的并发策略 ...

  4. atomic 包、synchronized | Java 中线程安全

    相关阅读 彻底搞懂 CPU 中的内存结构 Java 内存模型 ,一篇就够了! 多线程实现原理 之前已经说过了,我们在保证线程安全的时候主要就是保证线程安全的 3 大特性,原子性.可见性.有序性.而在 ...

  5. Java中的volatile关键字为什么不是不具有原子性

    Java中long赋值不是原子操作,因为先写32位,再写后32位,分两步操作,而AtomicLong赋值是原子操作,为什么?为什么volatile能替代简单的锁,却不能保证原子性?这里面涉及volat ...

  6. 【转载】Java中的锁机制 synchronized & 偏向锁 & 轻量级锁 & 重量级锁 & 各自优缺点及场景 & AtomicReference

    参考文章: http://blog.csdn.net/chen77716/article/details/6618779 目前在Java中存在两种锁机制:synchronized和Lock,Lock接 ...

  7. 4个点说清楚Java中synchronized和volatile的区别

    作者 : Hollis 回顾一下两个关键字:synchronized和volatile 1.Java语言为了解决并发编程中存在的原子性.可见性和有序性问题,提供了一系列和并发处理相关的关键字,比如sy ...

  8. Java并发指南4:Java中的锁 Lock和synchronized

    Java中的锁机制及Lock类 锁的释放-获取建立的happens before 关系 锁是java并发编程中最重要的同步机制.锁除了让临界区互斥执行外,还可以让释放锁的线程向获取同一个锁的线程发送消 ...

  9. java中的volatile和synchronized

    关于volatile和同步相关的东西,网上有太多错误和解释不清的东西, 所以查阅相关书籍和文章后总结如下, 如果还是也存在不正确的内容,请一定要指出来, 以免误人子弟:) 1. 原子性与可视性 原子性 ...

随机推荐

  1. hdu2100 26进制加法

    题意:       给你两个26进制数,让你算出他们两个的和. 思路:      水题不解释了,注意这样的数据 AAA AAA 输出A #include<stdio.h> #include ...

  2. 【原创】ansible常用模块整理

    一.Ansible模块帮助 ansible-doc -l # 列出 Ansible 支持的模块 ansible-doc ping # 查看该模块帮助信息 二.远程命令模块 2.1command com ...

  3. 如何让c语言使用结构体近似模拟c++中的类

    如今统治市场的主流编程语言,如c++,java,大都是面向对象类型的编程语言. 而众所周知,c语言是面向过程的编程语言,但是它拥有一个类似于类的结构,叫做结构体,主要的区别在于结构体无法定义函数. 因 ...

  4. LA3635派

    题意:       有F+1个人来分n个圆形派,每个人分到的必须是一个整块的派,形状无所谓,每个人分到的必须一样多,给你每个派的半径,问每个人能分到的最大派的面积是多少. 思路:       虽然不是 ...

  5. Linux下磁盘分区、卸载和磁盘配额

    目录 一:查看磁盘信息 二:Linux磁盘分区 三:Linux分区的卸载 四:Linux磁盘配额 一:查看磁盘信息 fdisk : 这个命令是磁盘分区表操作工具,fdisk能将磁盘分区,同时也能为每个 ...

  6. Wordpress主题编辑器漏洞复现

    Wordpress是全球流行的博客网站,全球有上百万人使用它来搭建博客.他使用PHP脚本和Mysql数据库来搭建网站. 那么,如果当我们在渗透测试过程中获得到了别人Wordpress的账号和密码之后, ...

  7. PowerShell-6.文件操作

    1.显示文本内容 Get-Content "°C:\\Program Files (x86)\\PsUpdate\\b.dat" 2.得到b.dat文件内容,然后把里面的所有'C' ...

  8. 去除腾讯视频logo水印

    打开F12,然后再console中输入下面代码,即可. document.querySelectorAll(".txp_waterMark_pic").forEach(functi ...

  9. layUI form表单 防止多次点击重复提交

    //监听 弹框-变更处理备注-提交 form.on('submit(popFormSubPass)', function (data) { //防止重复点击: 单击之后提交按钮不可选,防止重复提交 v ...

  10. IO系列测试源码

    //IO系列测试源码(需要自取) using System; using System.CodeDom; using System.Collections.Generic; using System. ...