当前位置:  编程技术>软件工程/软件设计
本页文章导读:
    ▪HEVC核心编码技术之一.图像的编码划分      Overview of the High Efficiency Video Coding(HEVC) Standard之四 IV. HEVC的编码技术 (as depicted in Fig. 1). The basic source-coding algorithm is a hybrid coding of the prediction residual signals to further exploit spatial statistical  to .........
    ▪cmake学习笔记      cmake用于跨平台的交叉编译工具,用于方便地生成nix系统下的makefile和windows下的project; 作者:Ryanliang 发表于2013-6-16 21:47:58 原文链接 阅读:0 评论:0 查看评论 ......
    ▪设计模式——小单例有大秘密      单例模式大家并不陌生,也都知道它分为什么懒汉式、饿汉式之类的。但是你对单例模式的理解足够透彻吗?今天我带大家一起来看看我眼中的单例,可能会跟你的认识有所不同。 下面是.........

[1]HEVC核心编码技术之一.图像的编码划分
    来源: 互联网  发布时间: 2013-11-19
Overview of the High Efficiency Video Coding(HEVC) Standard之四


IV. HEVC的编码技术
HEVC Video Coding Techniques


As in all prior ITU-T and ISO/IEC JTC 1 video coding standards since H.261 [2], 
the HEVC design follows the classic block-based hybrid video coding approach 
(as depicted in Fig. 1). The basic source-coding algorithm is a hybrid
of interpicture prediction to exploit temporal statistical dependences,
intrapicture prediction to exploit spatial statistical dependences, and transform 
coding of the prediction residual signals to further exploit spatial statistical 
dependences. There is no single coding element in the HEVC design that provides
the majority of its significant improvement in compression efficiency in relation 
to prior video coding standards. It is, rather, a plurality of smaller improvements 
that add up to the significant gain.
和从H.261以来的视频编码标准一样,HEVC的设计沿用了经典的基于块的混合视频编码方式(如图1所示)。
基本的信源编码算法是对时域统计相关性使用帧间预测,对空域统计相关性使用帧内预测,
再对预测残差信号使得变换编码进一步去除空间统计相关性。
HEVC取得比以前的标准更好的压缩效果,而且以很小的改善就取得了很大的收获。




Fig. 1. Typical HEVC video encoder (with decoder modeling elements shaded in light gray).


A. 图像的像素表示 
Sampled Representation of Pictures


For representing color video signals, HEVC typically uses a tristimulus YCbCr color 
space with 4:2:0 sampling (although extension to other sampling formats is 
straightforward, and is planned to be defined in a subsequent version). This separates 
a color representation into three components called Y, Cb, and Cr. The Y component is 
also called luma, and represents brightness. The two chroma components Cb and Cr represent
the extent to which the color deviates from gray toward blue and red, respectively. 
Because the human visual system is more sensitive to luma than chroma, the 4:2:0 sampling 
structure is typically used, in which each chroma component has one fourth of the number 
of samples of the luma component (half the number of samples in both the horizontal 
and vertical dimensions). Each sample for each component is typically represented with 8 
or 10 b of precision, and the 8-b case is the more typical one. In the remainder of 
    
[2]cmake学习笔记
    来源: 互联网  发布时间: 2013-11-19
cmake用于跨平台的交叉编译工具,用于方便地生成nix系统下的makefile和windows下的project;
作者:Ryanliang 发表于2013-6-16 21:47:58 原文链接
阅读:0 评论:0 查看评论

    
[3]设计模式——小单例有大秘密
    来源: 互联网  发布时间: 2013-11-19

单例模式大家并不陌生,也都知道它分为什么懒汉式、饿汉式之类的。但是你对单例模式的理解足够透彻吗?今天我带大家一起来看看我眼中的单例,可能会跟你的认识有所不同。

下面是一个简单的小实例:

//简单懒汉式
public class Singleton {
	
	//单例实例变量
	private static Singleton instance = null;
	
	//私有化的构造方法,保证外部的类不能通过构造器来实例化
	private Singleton() {}
	
	//获取单例对象实例
	public static Singleton getInstance() {
        
	    if (instance == null) { 
	        instance = new Singleton(); 
	    }
	    
	    System.out.println("我是简单懒汉式单例!");
	    return instance;
    }
}

很容易看出,上面这段代码在多线程的情况下是不安全的,当两个线程进入if (instance == null)时,两个线程都判断instance为空,接下来就会得到两个实例了。这不是我们想要的单例。


接下来我们用加锁的方式来实现互斥,从而保证单例的实现。

//同步法懒汉式
public class Singleton {
	
	//单例实例变量
	private static Singleton instance = null;
	
	//私有化的构造方法,保证外部的类不能通过构造器来实例化
	private Singleton() {}
	
	//获取单例对象实例
	public static synchronized  Singleton getInstance() {
        
        if (instance == null) { 
            instance = new Singleton(); 
        }
        
        System.out.println("我是同步法懒汉式单例!");
        return instance;
    }
}

加上synchronized后确实保证了线程安全,但是这样就是最好的方法吗?很显然它不是,因为这样一来每次调用getInstance()方法是都会被加锁,而我们只需要在第一次调用getInstance()的时候加锁就可以了。这显然影响了我们程序的性能。我们继续寻找更好的方法。


经过分析发现,只需要保证instance = new Singleton()是线程互斥就可以保证线程安全,所以就有了下面这个版本:

//双重锁定懒汉式
public class Singleton {
	
	//单例实例变量
	private static Singleton instance = null;
	
	//私有化的构造方法,保证外部的类不能通过构造器来实例化
	private Singleton() {}
	
	//获取单例对象实例
	public static Singleton getInstance() {
        if (instance == null) { 
            synchronized (Singleton.class) {
                if (instance == null) { 
                    instance = new Singleton(); 
                }
            }
        }
        System.out.println("我是双重锁定懒汉式单例!");
        return instance;
    }
}

这次看起来既解决了线程安全问题,又不至于每次调用getInstance()都会加锁导致降低性能。看起来是一个完美的解决方案,事实上是这样的吗?

很遗憾,事实并非我们想的那么完美。java平台内存模型中有一个叫“无序写”(out-of-order writes)的机制。正是这个机制导致了双重检查加锁方法的失效。这个问题的关键在上面代码上的第5行:instance = new Singleton(); 这行其实做了两个事情:1、调用构造方法,创建了一个实例。2、把这个实例赋值给instance这个实例变量。可问题就是,这两步jvm是不保证顺序的。也就是说。可能在调用构造方法之前,instance已经被设置为非空了。下面我们一起来分析一下:


假设有两个线程A、B

1、线程A进入getInstance()方法。

2、因为此时instance为空,所以线程A进入synchronized块。

3、线程A执行 instance = new Singleton(); 把实例变量instance设置成了非空。(注意,是在调用构造方法之前。)

4、线程A退出,线程B进入。

5、线程B检查instance是否为空,此时不为空(第三步的时候被线程A设置成了非空)。线程B返回instance的引用。(问题出现了,这时instance的引用并不是Singleton的实例,因为没有调用构造方法。) 

6、线程B退出,线程A进入。

7、线程A继续调用构造方法,完成instance的初始化,再返回。 


难道就没有一个好方法了吗?好的方法肯定是有的,我们继续探索!

//解决无序写问题懒汉式
public class Singleton {
	
	//单例实例变量
	private static Singleton instance = null;
	
	//私有化的构造方法,保证外部的类不能通过构造器来实例化
	private Singleton() {}
	
	//获取单例对象实例
	public static Singleton getInstance() {
		if (instance == null) { 
			synchronized (Singleton.class) {                  //1
				Singleton temp = instance;                //2
				if (temp == null) {
					synchronized (Singleton.class) {  //3 
						temp = new Singleton();   //4    
					}
					instance = temp;                  //5      
				}
			}
		}
		System.out.println("我是解决无序写懒汉式单例!");
		return instance;
	}	
}

1、线程A进入getInstance()方法。

2、因为instance是空的 ,所以线程A进入位置//1的第一个synchronized块。

3、线程A执行位置//2的代码,把instance赋值给本地变量temp。instance为空,所以temp也为空。 

4、因为temp为空,所以线程A进入位置//3的第二个synchronized块。

5、线程A执行位置//4的代码,把temp设置成非空,但还没有调用构造方法!(“无序写”问题) 

6、线程A阻塞,线程B进入getInstance()方法。

7、因为instance为空,所以线程B试图进入第一个synchronized块。但由于线程A已经在里面了。所以无法进入。线程B阻塞。

8、线程A激活,继续执行位置//4的代码。调用构造方法。生成实例。

9、将temp的实例引用赋值给instance。退出两个synchronized块。返回实例。

10、线程B激活,进入第一个synchronized块。

11、线程B执行位置//2的代码,把instance实例赋值给temp本地变量。

12、线程B判断本地变量temp不为空,所以跳过if块。返回instance实例。


到此为止,上面的问题我们是解决了,但是我们突然发现为了解决线程安全问题,但给人的感觉就像身上缠了很多毛线.... 乱糟糟的,所以我们要精简一下:

//饿汉式
public class Singleton {
	
	//单例变量 ,static的,在类加载时进行初始化一次,保证线程安全 
	private static Singleton instance = new Singleton();    
	
	//私有化的构造方法,保证外部的类不能通过构造器来实例化。     
	private Singleton() {}
	
	//获取单例对象实例     
	public static Singleton getInstance() {
	    System.out.println("我是饿汉式单例!");
	    return instance;
	}
}

看到上面的代码,瞬间觉得这个世界清静了。不过这种方式采用的是饿汉式的方法,就是预先声明Singleton对象,这样带来的一个缺点就是:如果构造的单例很大,构造完又迟迟不使用,会导致资源浪费。



    
最新技术文章:
▪主-主数据库系统架构    ▪java.lang.UnsupportedClassVersionError: Bad version number i...    ▪eclipse项目出现红色叉叉解决方案
▪Play!framework 项目部署到Tomcat    ▪dedecms如何做中英文网站?    ▪Spring Batch Framework– introduction chapter(上)
▪第三章 AOP 基于@AspectJ的AOP    ▪基于插件的服务集成方式    ▪Online Coding开发模式 (通过在线配置实现一个表...
▪观察者模式(Observer)    ▪工厂模式 - 程序实现(java)    ▪几种web并行化编程实现
▪机器学习理论与实战(二)决策树    ▪Hibernate(四)——全面解析一对多关联映射    ▪我所理解的设计模式(C++实现)——解释器模...
▪利用规则引擎打造轻量级的面向服务编程模式...    ▪google blink的设计计划: Out-of-Progress iframes    ▪FS SIP呼叫的消息线程和状态机线程
▪XML FREESWITCH APPLICATION 实现    ▪Drupal 实战    ▪Blink: Chromium的新渲染引擎
▪(十四)桥接模式详解(都市异能版)    ▪你不知道的Eclipse用法:使用Allocation tracker跟...    ▪Linux内核-进程
▪你不知道的Eclipse用法:使用Metrics 测量复杂度    ▪IT行业为什么没有进度    ▪Exchange Server 2010/2013三种不同的故障转移
▪第二章 IoC Spring自动扫描和管理Bean    ▪CMMI简介    ▪目标检测(Object Detection)原理与实现(六)
▪值班总结(1)——探讨sql语句的执行机制    ▪第二章 IoC Annotation注入    ▪CentOS 6.4下安装Vagrant
▪Java NIO框架Netty1简单发送接受    ▪漫画研发之八:会吃的孩子有奶吃    ▪比较ASP和ASP.NET
▪SPRING中的CONTEXTLOADERLISTENER    ▪在Nginx下对网站进行密码保护    ▪Hibernate从入门到精通(五)一对一单向关联映...
▪.NET领域驱动设计—初尝(三:穿过迷雾走向光...    ▪linux下的块设备驱动(一)    ▪Modem项目工作总结
▪工作流--JBPM简介及开发环境搭建    ▪工作流--JBPM核心服务及表结构    ▪Eclipse:使用JDepend 进行依赖项检查
▪windows下用putty上传文件到远程Linux方法    ▪iBatis和Hibernate的5点区别    ▪基于学习的Indexing算法
▪设计模式11---设计模式之中介者模式(Mediator...    ▪带你走进EJB--JMS编程模型    ▪从抽象谈起(二):观察者模式与回调
▪设计模式09---设计模式之生成器模式(Builder)也...    ▪svn_resin_持续优化中    ▪Bitmap recycle方法与制作Bitmap的内存缓存
▪Hibernate从入门到精通(四)基本映射    ▪设计模式10---设计模式之原型模式(Prototype)    ▪Dreamer 3.0 支持json、xml、文件上传
▪Eclipse:使用PMD预先检测错误    ▪Jspx.net Framework 5.1 发布    ▪从抽象谈起(一):工厂模式与策略模式
▪Eclipse:使用CheckStyle实施编码标准    ▪【论文阅读】《Chain Replication for Supporting High T...    ▪Struts2 Path_路径问题
▪spring 配置文件详解    ▪Struts2第一个工程helloStruts极其基本配置    ▪Python学习入门基础教程(learning Python)--2 Python简...
▪maven springmvc环境配置    ▪基于SCRUM的金融软件开发项目    ▪software quality assurance 常见问题收录
▪Redis集群明细文档    ▪Dreamer 框架 比Struts2 更加灵活    ▪Maven POM入门
▪git 分支篇-----不断更新中    ▪Oracle非主键自增长    ▪php设计模式——UML类图
▪Matlab,Visio等生成的图片的字体嵌入问题解决...    ▪用Darwin和live555实现的直播框架    ▪学习ORM框架—hibernate(二):由hibernate接口谈...
▪(十)装饰器模式详解(与IO不解的情缘)    ▪无锁编程:最简单例子    ▪【虚拟化实战】网络设计之四Teaming
▪OSGi:生命周期层    ▪Javascript/Jquery——简单定时器    ▪java代码 发送GET、POST请求
▪Entity Framework底层操作封装(3)    ▪HttpClient 发送GET、POST请求    ▪使用spring框架,应用启动时,加载数据
▪Linux下Apache网站目录读写权限的设置    ▪单键模式的C++描述    ▪学习ORM框架—hibernate(一):初识hibernate
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3