`
jeff312
  • 浏览: 77330 次
  • 性别: 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又是什么意思呢?很简单,就是“在这段代码执行期间,调用这段代码的对象及其所有状态(成员)都被锁定,直到方法执行结束”。
分享到:
评论

相关推荐

    从C++转到Java需注意的地方

    ### 从C++转向Java需要注意的关键点 #### Java标准库介绍 Java标准库是一系列预定义的类和接口集合,为开发人员提供了丰富的...对于从C++转向Java的开发者而言,理解这些关键差异将有助于更快地适应Java的编程环境。

    JAVA,C++面试宝典

    综上所述,"JAVA,C++面试宝典"涵盖的范围广泛,从基础语法到高级特性和实战应用,都是面试者需要准备的关键内容。通过系统学习和深入理解这些知识点,不仅能够提高面试成功率,更能为日常开发工作打下坚实基础。无论...

    面试笔试题库(JAVA\C\C++\数据库)

    【Java知识点】 Java是一种广泛应用的面向对象的编程语言,以其跨平台、安全性强、性能高效等特点...通过深入学习和解答这些题目,可以提升对Java、C、C++编程语言的理解,以及数据库的相关技能,为面试做好充分准备。

    java.c++面试题目

    - 多线程:理解并发编程的基本概念,如线程同步、互斥锁、死锁等。 - IO流:掌握文件操作、网络IO,理解字节流和字符流的区别。 - Java8及以上新特性:函数式编程、Stream API、Optional类等。 2. **C++基础知识...

    中兴计算面试题目pdf C++ java

    面试中可能会涉及Java基础语法、集合框架(如ArrayList、LinkedList、HashMap等)、多线程、IO流、异常处理、设计模式、JVM(Java虚拟机)工作原理、反射机制、Java 8新特性等知识点。 3. **操作系统**:操作系统是...

    线程进程互斥锁

    例如,在C++中,可以使用`std::mutex`,Python有`threading.Lock`,Java有`synchronized`关键字,Go语言则有`sync.Mutex`。每种实现方式都遵循类似的原理,但具体语法和细节有所不同。 综上所述,线程进程互斥锁是...

    书籍集合C.C++、java

    - **并发编程**:多线程编程基础知识,如线程安全问题、锁机制等。 #### 二、Java Java作为一门广泛使用的面向对象编程语言,其书籍也涵盖了从入门到精通的各个阶段。 ##### 1. Java基础 - **语法介绍**:变量、...

    语义差异修复_Java_C++_下载.zip

    4. **线程与并发**:Java的并发库提供了丰富的线程安全工具,C++则更依赖底层的互斥锁和条件变量。修复并发问题需要了解并发模型和同步原语。 5. **对象生命周期**:Java的对象生命周期由JVM控制,C++需要手动构造...

    达内面试笔记,分享(C++/Java)

    - **并发编程**:线程生命周期、同步机制、锁机制、并发容器与框架(如Executor框架)等。 - **反射机制**:Class对象、Field、Method、Constructor等的使用。 - **注解**:注解的基本概念、元注解、自定义注解及其...

    java C C++面试题

    在IT行业中,面试是检验开发者技能的关键环节,尤其对于Java、C和C++这些主流编程语言的开发者来说,深入理解并掌握相关知识至关重要。本文将根据"Java C C++面试题"这一主题,结合文件名"Java面试题集锦.pdf"、"C_...

    Java学习、面试必备

    - 多线程:Java提供了Thread类和Runnable接口来实现并发执行,理解和掌握线程同步、锁机制是高级Java开发的关键。 - 集合框架:深入学习Set、List、Map接口及其实现类,如HashSet、ArrayList、LinkedList、HashMap...

    java笔记javajava

    Java语法与C++类似,但更简化了一些特性,使其更适合网络环境。在"java笔记javajava"这个主题中,我们可以深入探讨以下几个关键知识点: 1. **Java基础**:包括变量、数据类型、运算符、控制流程(如if语句、for...

    200篇阿里面经 Java C++

    【阿里面经合集】是众多求职者在准备面试阿里巴巴时的重要参考资料,涵盖了从Java、C++到Android、算法、测开、数据分析等多个技术岗位的面试经验分享。这些面经通常包括了面试过程中的问题、面试者的解答思路、以及...

    C/C++、Java、软测 笔试面试题集合

    在IT行业中,C/C++、Java以及软件测试是三大核心领域,对于求职者来说,掌握这些领域的知识并能应对各种笔试面试题至关重要。本资源集合包含了大量的C/C++、Java及软测相关的笔试面试题,涵盖了众多知名大公司的题目...

    Java学习教案(生手必备)

    Java提供了线程和锁机制,使得程序可以在多核处理器上并行执行,从而提高性能。学习如何创建和管理线程,理解同步和互斥的概念,以及如何使用synchronized关键字和Lock接口,都是成为熟练Java开发者所必须的。 最后...

    Java基础技术栈图解大全-xmind源文件

    Java基础技术栈是Java开发人员必须掌握的核心技能集,它涵盖了编程语法、数据结构、面向对象编程、异常处理、输入/输出(I/O)、集合框架、多线程、网络编程等多个方面。对于初学者来说,理解并掌握这些知识点至关重要...

    Java编程思想第四版完整中文高清版(免费)1

    这本书被誉为是最好的Java参考书之一,涵盖了Java语言的所有方面,从基本语法到高级特性 zoals 网络编程、高级面向对象能力、多线程等。该书的作者Bruce Eckel是一名经验丰富的编程专家,曾教授过世界上许多地区的人...

    C/C++编程面试题大总结

    14. **并发与多线程**:在多核CPU环境下,理解和使用C++的线程库(如std::thread),以及同步机制(如互斥锁、条件变量)至关重要。 15. **最新C++标准特性**:如C++11、C++14、C++17引入的新特性,如右值引用、...

    shell shell java c c++

    - 并发编程:线程和锁机制。 ### C 编程 C 语言是一种通用的、过程式的编程语言,广泛应用于操作系统、嵌入式系统等领域。以下是一些关键知识点: 1. **基本语法**: - 数据类型:如整型 `int`、字符型 `char`...

    java高级 初级 中级 教程

    Java提供了线程和锁机制来实现多任务并行执行,这对于优化性能和构建复杂的分布式系统至关重要。此外,我们还需要学习Java的反射机制,它允许我们在运行时检查和修改类、接口、字段和方法。再者,JNI(Java Native ...

Global site tag (gtag.js) - Google Analytics