揭示同步块索引(上):从lock开始

大家都知道引用类型对象除实例字段的开销外,还有两个字段的开销:类型指针和同步块索引 (SyncBlockIndex)。同步块索引这个东西比起它的兄弟类型指针更少受人关注,显得有点冷落,其实此 兄功力非凡,在CLR里可谓叱咤风云,很多功能都要借助它来实现。

接下来我会用三篇来介绍同步块索引在.NET中的所作所为。

既然本章副标题是从lock开始,那我就举几个lock的示例:

代码1

public class Singleton
{
    private static object lockHelper = new object();

    private static Singleton _instance = null;

    public static Singleton Instance
    {
        get
        {
            lock (lockHelper)
            {
                if (_instance == null)
                    _instance = new Singleton();
            }

            return _instance;
        }
    }
}

代码2

public class Singleton
{
    private static Singleton _instance = null;

    public static Singleton Instance
    {
        get
        {
            object lockHelper = new object();

            lock (lockHelper)
            {
                if (_instance == null)
                    _instance = new Singleton();
            }

            return _instance;
        }
    }
}

时间: 2024-11-03 19:21:25

揭示同步块索引(上):从lock开始的相关文章

艾伟_转载:揭示同步块索引(上):从lock开始

大家都知道引用类型对象除实例字段的开销外,还有两个字段的开销:类型指针和同步块索引(SyncBlockIndex).同步块索引这个东西比起它的兄弟类型指针更少受人关注,显得有点冷落,其实此兄功力非凡,在CLR里可谓叱咤风云,很多功能都要借助它来实现. 接下来我会用三篇来介绍同步块索引在.NET中的所作所为. 既然本章副标题是从lock开始,那我就举几个lock的示例: 代码1 1: public class Singleton 2: { 3: private static object lock

揭示同步块索引(下):总结

前面,我用两篇文章详细的讨论了同步块索引在lock和GetHashCode所起的作用.不过两篇文章是分开 来讨论的.那可能有人会问,如果我有一个object,它既作为lock的lockHelper对象,也要调用它的 GetHashCode方法该怎么办,难道这个同步块索引还可以承担这两个任务么.同步块索引是可以承担这两 个任务,但是里面却隐藏着更大的秘密,我们先来看看与同步块索引相关的结构: 大致就是这样的一个结构,一个对象的ObjectHeader中的SyncBlockIndex指向一个Sync

揭示同步块索引(中):如何获得对象的HashCode

Visual Studio + SOS 小实验 咋一看标题,觉得有些奇怪,同步块索引和HashCode有啥关系呢.从名字上来看离着十万八千里.在 不知道细节之前,我也是这样想的,知道细节之后,才发现这两兄弟如此亲密.我们还是先来用Visual Studio + SOS,看一个东西,下面是作为小白兔的示例代码: 1: using System; 2: public class Program 3: { 4: static void Main() 5: { 6: Foo f = new Foo();

基本线程同步(五)使用Lock同步代码块

声明:本文是< Java 7 Concurrency Cookbook >的第二章,作者: Javier Fernández González     译者:许巧辉 校对:方腾飞 使用Lock同步代码块 Java提供另外的机制用来同步代码块.它比synchronized关键字更加强大.灵活.它是基于Lock接口和实现它的类(如ReentrantLock).这种机制有如下优势: 它允许以一种更灵活的方式来构建synchronized块.使用synchronized关键字,你必须以结构化方式得到释

Java线程机制(四) 同步方法和同步块

在之前例子的基础上,我们增加新的功能:根据正确与不正确的响应来显示玩家的分数. public class ScoreLabel extends JLabel implements CharacterListener { private volatile int score = 0; private int char2type = -1; private CharacterSource generator = null, typist = null; public ScoreLabel(Chara

Java同步块

原文链接 作者:Jakob Jenkov 译者:李同杰 Java 同步块(synchronized block)用来标记方法或者代码块是同步的.Java同步块用来避免竞争.本文介绍以下内容: Java同步关键字(synchronzied) 实例方法同步 静态方法同步 实例方法中同步块 静态方法中同步块 Java同步示例 Java 同步关键字(synchronized) Java中的同步块用synchronized标记.同步块在Java中是同步在某个对象上.所有同步在一个对象上的同步块在同时只能被

同步块

打个比方:一个object就像一个大房子,大门永远打开.房子里有很多房间(也就是方法).这些房间有上锁的(synchronized方法),和不上锁之分(普通方法).房门口放着一把钥匙(key),这把钥匙可以打开所有上锁的房间.另外我把所有想调用该对象方法的线程比喻成想进入这房子某个房间的人.所有的东西就这么多了,下面我们看看这些东西之间如何作用的. 在此我们先来明确一下我们的前提条件.该对象至少有一个synchronized方法,否则这个key还有啥意义.当然也就不会有我们的这个主题了. 一个人

Java 并发/多线程教程(十二)-JAVA同步块

本系列译自jakob jenkov的Java并发多线程教程,个人觉得很有收获.由于个人水平有限,不对之处还望矫正! 一个Java同步块标记一个方法或一个代码块作为同步.可以使用Java同步块来避免竞态条件. java同步关键字       在Java中同步的块被标记为Synchronized关键字.Java中的同步块在某些对象上是同步的.在同一对象上同步的所有同步块只能在同一时间内执行一个线程.所有试图进入同步块的其他线程都被阻塞,直到同步块中的线程退出该块. Synchronized关键字可以

RDS for MySQL 表上 Metadata lock 的产生和处理

RDS for MySQL 表上 Metadata lock 的产生和处理 1. Metadata lock wait 出现的场景 2. Metadata lock wait 的含义 3. 导致 Metadata lock wait 等待的活动事务 4. 解决方案 5. 如何避免出现长时间 Metadata lock wait 导致表上相关查询阻塞,影响业务 1. Metadata lock wait 出现的场景 创建.删除索引 修改表结构 表维护操作(optimize table.repair