`
jeff312
  • 浏览: 76318 次
  • 性别: Icon_minigender_1
  • 来自: 新加坡
社区版块
存档分类
最新评论

从C++语法角度理解Java线程锁

    博客分类:
  • J2EE
阅读更多
做WEB应用不可能不接触到线程锁的问题,尽管背后的原理很简单,但说实话要真正理解并在实践中保持信心不太容易。

许多初学者看到某些代码的同步锁(synchronize关键字)之后,便诚惶诚恐地在自己的类方法里也加上很多不必要的同步锁,甚至开始怀疑单例类在web中的实用价值,这种表现其实是还没有理解同步锁的概念。

首先一个问题是同步“锁”的是什么。在网上一搜,会查到一些言简意赅的解释,如“同步锁的是对象,而不是方法”。它虽然完全正确,但还不足以拉菜鸟上岸,因为必然还会有人问:“方法难道不是对象的方法吗,怎么会有锁了对象却不锁方法的概念?”答案说穿了一文不值,实际上只要是学过C++的人立刻就能明白怎么回事。

C++中的函数(方法)类型是非常丰富的,对于类方法的定义方式也不止一种。一个常见的定义类方法的方式是,在类体内只声明函数名、返回值和参数类型,而真正的函数体代码却放在类定义体外的地方,例如:

class CClass {
private:
    int id;
public:
    int getId();
    void setId(int id);
}

int CClass::getId() {return this.id}
void CClass::setId(int id) {this.id = id}


可以这么说,类方法就是一段过程计算代码而已,只不过这段代码有充分的权限可以访问类成员(字段或其他类方法)。这个概念推到极端的例子就是友元函数,这个与类定义完全无关的,可以被其他类或函数调用的公共函数也可以在经过类定义声明后,具有访问类成员的权限。

回到Java上来,既然方法(函数)除了其名字要让类定义声明之外,其实与公共函数并无太大区别,其代码块也不属于类所有,那么同步锁在锁对象的时候,当然也就没有能力锁到方法上去。因此,单例模式下的对象方法(如许多DAO)并没有什么并发问题,除非涉及到一些公共资源如集合类。在了解了Java程序运行的内存分布我们也能明白,所有类的方法代码都是放在代码区(code segment)中待调用的,同步锁作用的范围是堆空间(heap)中的相应对象,与代码区无关。

那么在方法上加synchronize又是什么意思呢?很简单,就是“在这段代码执行期间,调用这段代码的对象及其所有状态(成员)都被锁定,直到方法执行结束”。
分享到:
评论

相关推荐

    深入理解_Java_虚拟机 JVM_高级特性与最佳实践

    / 328 12.3.6 先行发生原则 / 330 12.4 Java与线程 / 333 12.4.1 线程的实现 / 333 12.4.2 Java线程调度 / 337 12.4.3 状态转换 / 339 12.5 本章小结 / 341 第13章 线程安全与锁优化 / 342 13.1 概述 / 342 ...

    Java 虚拟机面试题全面解析(干货)

    Java线程的实现 Java线程调度 什么是线程调度? 线程调度有哪些方法? 线程安全的定义? Java语言操作的共享数据,包括哪些? 不可变 如何实现线程安全? 阻塞同步(互斥同步) 非阻塞同步 锁优化是在DK的那个版本? 为什么要...

    汪文君高并发编程实战视频资源下载.txt

    │ 高并发编程第一阶段28讲、线程生产者消费者的综合实战结合Java8语法.mp4 │ 高并发编程第一阶段29讲、如何实现一个自己的显式锁Lock精讲上.mp4 │ 高并发编程第一阶段30讲、如何实现一个自己的显式锁Lock精讲...

    在一小时内学会 C#(txt版本)

    如果你已经知晓 C++ 语言,本文将在不到一小时的时间内带你快速浏览 C# 的语法。如果熟悉 Java 语言,Java 的编程结构、打包和垃圾回收的概念肯定对你快速学习 C# 大有帮助。所以我在讨论 C# 语言构造的时候会假设你...

    汪文君高并发编程实战视频资源全集

    │ 高并发编程第一阶段28讲、线程生产者消费者的综合实战结合Java8语法.mp4 │ 高并发编程第一阶段29讲、如何实现一个自己的显式锁Lock精讲上.mp4 │ 高并发编程第一阶段30讲、如何实现一个自己的显式锁Lock精讲...

    Visual C#2010 从入门到精通(Visual.C#.2010.Step.By.Step).完整去密码锁定版 I部分

    无论是刚开始接触面向对象编程的新手,还是打算转移到c#的具有c,c++或者java基础的程序员,都可以从本书中吸取到新的知识。 作译者 john sharp,content master首席技术专家。content master隶属于cm集团,cm集团...

    leetcode走楼梯-coding_interview_tips:coding_interview_tips

    O、链表、堆栈和队列、树和图、递归和动态编程、排序和搜索以及线程和锁。 我建议使用 C++、Java 或 Python 作为编码语言。 曾经有一家公司告诉我,他们更喜欢我使用静态类型语言,如 C++ 或 Java,但大多数地方会很...

    C#微软培训资料

    18.2 在 C #代码中调用 C++和 VB 编写的组件 .240 18.3 版 本 控 制 .249 18.4 代 码 优 化 .252 18.5 小 结 .254 第五部分 附 录 .255 附录 A 关 键 字.255 附录 B 错 误 码.256 附录 C .Net 名字空间...

    MySQL中文参考手册

    + 4.12.5 用 SSH 从 Win32 连接一个远程MySQL + 4.12.6 MySQL-Win32与Unix MySQL 比较 o 4.13 OS/2 注意事项 o 4.14 TcX 二进制代码 o 4.15 安装后期(post-installation)的设置与测试 + 4.15.1 运行mysql_...

    MySQL中文参考手册.chm

    13 维护 MySQL 安装 13.1 使用myisamchk进行表维护和崩溃恢复 13.1.1 myisamchk的调用语法 13.1.2 myisamchk的内存使用 13.2 13.2 建立一个数据库表维护规范 13.3 获得关于一个表的信息...

    asp.net知识库

    从NUnit中理解.NET自定义属性的应用(转载) 如何在.NET中实现脚本引擎 (CodeDom篇) .NET的插件机制的简单实现 我对J2EE和.NET的一点理解 难分难舍的DSO(一) InternalsVisibleToAttribute,友元程序集访问属性 ...

    易语言程序免安装版下载

     支持静态链接其它编程语言(如C/C++、汇编等)编译生成的静态库(.LIB或.OBJ),但仅限于COFF格式,支持cdecl和stdcall两种函数调用约定。  使用说明如下:函数声明和调用方法与DLL命令一致;“库文件名”以.lib...

Global site tag (gtag.js) - Google Analytics