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修饰一下就好了

最新文章

  1. 【三石jQuery视频教程】01.图片循环展示
  2. phpmyadmin的root密码忘记了怎么办?
  3. [转载] python 计算字符串长度
  4. NYOJ题目874签到
  5. cargo failed to finish deploying within the timeout period [120000]
  6. HTTP02--Http请求头及缓存知识
  7. GLSL
  8. 【转】Centos系统文件与用户权限分配详解ftp,nginx,php
  9. jquery 点击页面其他地方实现隐藏菜单功能
  10. JS(一)
  11. linux+tomcat+jdk环境验证码无法显示
  12. vue指令v-cloak示例解析
  13. Web Worker Best Practices
  14. fileWriter.go
  15. 2019swpuj2ee作业3
  16. react在router中传递数据的2种方法
  17. springboot(七)邮件服务
  18. C++ 冒泡排序、选择排序、快速排序
  19. vue引用公用的头部和尾部文件。
  20. python_面向对象小试题

热门文章

  1. 1061 Dating
  2. 【ElasticSearch】ES线上脏数据处理
  3. Flyway-数据库迁移工具
  4. think php 5.x
  5. hdu4020简单想法题
  6. POJ 1679 判断最小树是否唯一
  7. Python第一章-基础知识
  8. Could not contact [localhost:8005]. Tomcat may not be running.
  9. js 实现 bind 的这五层,你在第几层?
  10. mysql 的查询操作语句---自动生成各种不同的序号