精华内容
下载资源
问答
  • 初级概念

    2014-06-11 00:43:15
    关联:比如大雁天气有关
    关联:比如大雁和天气有关,UML实现箭头表示 
    

    class Penguin:Bird
    {
         private Climate climate;
    }
    
    聚合:弱的“拥有”关系,如雁群包含一只大雁,但是大雁不是雁群的不可分割的一部分,与组合相区别,UML空心的菱形加箭头

     
    class Penguins
    {
        private Penguin[] penguins;
    }
    
    组合:强的“拥有”关系,如大雁有两只翅膀,可以看成是不可分割的一部分,UML实心的菱形加箭头
    class Penguin
    {
        private Wing wing;
        public Penguin()
        {
           wing = new Wing();
         }
    }
    
    依赖:如大雁依赖水


    展开全文
  • springmvc二级缓存,查询缓存

    千次阅读 2015-09-18 16:17:51
    目前在使用spring-data-jpahibernate4的时候,对于缓存关系不是很清楚,以及二级缓存查询缓存的各种配置等等,于是就有了这篇初级的jpa+hibernate缓存配置使用的文章。  JPAhibernate的缓存关系,以及系统...
    本文所有测试用代码在https://github.com/wwlleo0730/restjplat 的分支addDB上 

    目前在使用spring-data-jpa和hibernate4的时候,对于缓存关系不是很清楚,以及二级缓存和查询缓存的各种配置等等,于是就有了这篇初级的jpa+hibernate缓存配置使用的文章。 

    JPA和hibernate的缓存关系,以及系统demo环境说明 

    JPA全称是:Java Persistence API 

    引用
    JPA itself is just a specification, not a product; it cannot perform persistence or anything else by itself. 

    JPA仅仅只是一个规范,而不是产品;使用JPA本身是不能做到持久化的。

    所以,JPA只是一系列定义好的持久化操作的接口,在系统中使用时,需要真正的实现者,在这里,我们使用Hibernate作为实现者。所以,还是用spring-data-jpa+hibernate4+spring3.2来做demo例子说明本文。 

    JPA规范中定义了很多的缓存类型:一级缓存,二级缓存,对象缓存,数据缓存,等等一系列概念,搞的人糊里糊涂,具体见这里: 
    http://en.wikibooks.org/wiki/Java_Persistence/Caching 

    不过缓存也必须要有实现,因为使用的是hibernate,所以基本只讨论hibernate提供的缓存实现。 


    很多其他的JPA实现者,比如toplink(EclipseLink),也许还有其他的各种缓存实现,在此就不说了。 

    先直接给出所有的demo例子 

    hibernate实现中只有三种缓存类型: 一级缓存,二级缓存和查询缓存。 

    在hibernate的实现概念里,他把什么集合缓存之类的统一放到二级缓存里去了。 

    1. 一级缓存测试: 

    文件配置: 
    Java代码 
    <bean id="entityManagerFactory"  
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">  
        <property name="dataSource" ref="dataSource" />  
        <property name="jpaVendorAdapter" ref="hibernateJpaVendorAdapter" />  
        <property name="packagesToScan" value="com.restjplat.quickweb" />  
        <property name="jpaProperties">  
            <props>  
                <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>  
                <prop key="hibernate.format_sql">true</prop>  
            </props>  
        </property>  
    </bean>  

    可见没有添加任何配置项。 

    Java代码 
    private void firstCacheTest(){    
        EntityManager em = emf.createEntityManager();  
        Dict d1 = em.find(Dict.class, 1); //find id为1的对象  
        Dict d2 = em.find(Dict.class, 1); //find id为1的对象  
        logger.info((d1==d2)+""); //true  
      
        EntityManager em1 = emf.createEntityManager();  
        Dict d3 = em1.find(Dict.class, 1); //find id为1的对象  
        EntityManager em2 = emf.createEntityManager();  
        Dict d4 = em2.find(Dict.class, 1); //find id为1的对象  
        logger.info((d3==d4)+""); //false  
    }  

    Java代码  
    输出为:因为sql语句打出来太长,所以用*号代替  
    Hibernate: ***********  
    2014-03-17 20:41:44,819  INFO [main] (DictTest.java:76) - true  
    Hibernate: ***********  
    Hibernate: ***********  
    2014-03-17 20:41:44,869  INFO [main] (DictTest.java:84) - false  

    由此可见:同一个session内部,一级缓存生效,同一个id的对象只有一个。不同session,一级缓存无效。 

    2. 二级缓存测试: 

    文件配置: 

    1:实体类直接打上 javax.persistence.Cacheable 标记。 

    Java代码  
    @Entity  
    @Table(name ="dict")  
    @Cacheable  
    public class Dict extends IdEntity{}  

    2:配置文件修改,在 jpaProperties 下添加,用ehcache来实现二级缓存,另外因为加入了二级缓存,我们将hibernate的统计打开来看看到底是不是被缓存了。 
    Java代码  收藏代码
    <prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</prop>  
    <prop key="javax.persistence.sharedCache.mode">ENABLE_SELECTIVE</prop>  
    <prop key="hibernate.generate_statistics">true</prop>  

    注1:如果在配置文件中加入了 
    <prop key="javax.persistence.sharedCache.mode">ENABLE_SELECTIVE</prop>,则不需要在实体内配置hibernate的 @cache标记,只要打上JPA的@cacheable标记即可默认开启该实体的2级缓存。 

    注2:如果不使用javax.persistence.sharedCache.mode配置,直接在实体内打@cache标记也可以。 

    Java代码 
    @Cache(usage = CacheConcurrencyStrategy.READ_ONLY)  
    public class Dict extends IdEntity{}  

    至于 hibernate的 hibernate.cache.use_second_level_cache这个属性,文档里是这么写的: 
    引用
    Can be used to completely disable the second level cache, which is enabled by default for classes which specify a <cache> mapping.

    即打上只要有@cache标记,自动开启。 


    所以有两种方法配置开启二级缓存: 

    第一种不使用hibernate的@cache标记,直接用@cacheable标记和缓存映射配置项。 

    第二种用hibernate的@cache标记使用。 

    另外javax.persistence.sharedCache.mode的其他配置如下: 

    The javax.persistence.sharedCache.mode property can be set to one of the following values: 
    ENABLE_SELECTIVE (Default and recommended value): entities are not cached unless explicitly marked as cacheable.
    DISABLE_SELECTIVE: entities are cached unless explicitly marked as not cacheable.
    NONE: no entity are cached even if marked as cacheable. This option can make sense to disable second-level cache altogether.
    ALL: all entities are always cached even if marked as non cacheable.
    如果用all的话,连实体上的@cacheable都不用打,直接默认全部开启二级缓存 

    测试代码: 
    Java代码  
    private void secondCachetest(){  
            EntityManager em1 = emf.createEntityManager();  
            Dict d1 = em1.find(Dict.class, 1); //find id为1的对象  
            logger.info(d1.getName());  
            em1.close();  
              
            EntityManager em2 = emf.createEntityManager();  
            Dict d2 = em2.find(Dict.class, 1); //find id为1的对象  
            logger.info(d2.getName());  
            em2.close();  
        }  


    输出: 
    Java代码  
    Hibernate: **************  
    a  
    a  
    ===================L2======================  
    com.restjplat.quickweb.model.Dict : 1  

    可见二级缓存生效了,只输出了一条sql语句,同时监控中也出现了数据。 

    另外也可以看看如果是配置成ALL,并且把@cacheable删掉,输出如下: 

    Java代码 
    Hibernate: ************  
    a  
    a  
    ===================L2======================  
    com.restjplat.quickweb.model.Children : 0  
    com.restjplat.quickweb.model.Dict : 1  
    org.hibernate.cache.spi.UpdateTimestampsCache : 0  
    org.hibernate.cache.internal.StandardQueryCache : 0  
    com.restjplat.quickweb.model.Parent : 0  
    =================query cache=================  

    并且可以看见,所有的实体类都加入二级缓存中去了 


    3. 查询缓存测试: 
    一,二级缓存都是根据对象id来查找,如果需要加载一个List的时候,就需要用到查询缓存。 
    在Spring-data-jpa实现中,也可以使用查询缓存。 


    文件配置: 

    在 jpaProperties 下添加,这里必须明确标出增加查询缓存。 
    Java代码  收藏代码

    <prop key="hibernate.cache.use_query_cache">true</prop>  


    然后需要在方法内打上@QueryHint来实现查询缓存,我们写几个方法来测试如下: 

    Java代码 
    public interface DictDao extends JpaRepository<Dict, Integer>,JpaSpecificationExecutor<Dict>{  
      
        // spring-data-jpa默认继承实现的一些方法,实现类为  
        // SimpleJpaRepository。  
        // 该类中的方法不能通过@QueryHint来实现查询缓存。  
        @QueryHints({ @QueryHint(name = "org.hibernate.cacheable", value ="true") })  
        List<Dict> findAll();  
          
        @Query("from Dict")  
        @QueryHints({ @QueryHint(name = "org.hibernate.cacheable", value ="true") })  
        List<Dict> findAllCached();  
          
        @Query("select t from Dict t where t.name = ?1")  
        @QueryHints({ @QueryHint(name = "org.hibernate.cacheable", value ="true") })  
        Dict findDictByName(String name);  
    }  

    测试方法 
    Java代码  
    private void QueryCacheTest(){  
            //无效的spring-data-jpa实现的接口方法  
            //输出两条sql语句  
            dao.findAll();  
            dao.findAll();  
            System.out.println("================test 1 finish======================");  
            //自己实现的dao方法可以被查询缓存  
            //输出一条sql语句  
            dao.findAllCached();  
            dao.findAllCached();  
            System.out.println("================test 2 finish======================");  
            //自己实现的dao方法可以被查询缓存  
            //输出一条sql语句  
            dao.findDictByName("a");  
            dao.findDictByName("a");  
            System.out.println("================test 3 finish======================");  
        }  

    输出结果: 
    Java代码  
    Hibernate: **************  
    Hibernate: **************  
    ================test 1 finish======================  
    Hibernate: ***********  
    ================test 2 finish======================  
    Hibernate: ***********  
    ================test 3 finish======================  
    ===================L2======================  
    com.restjplat.quickweb.model.Dict : 5  
    org.hibernate.cache.spi.UpdateTimestampsCache : 0  
    org.hibernate.cache.internal.StandardQueryCache : 2  
    =================query cache=================  
    select t from Dict t where t.name = ?1  
    select generatedAlias0 from Dict as generatedAlias0  
    from Dict  

    很明显,查询缓存生效。但是为什么第一种方法查询缓存无法生效,原因不明,只能后面看看源代码了。 


    4.集合缓存测试: 

    根据hibernate文档的写法,这个应该是算在2级缓存里面。 
    测试类: 
    Java代码 
    @Entity  
    @Table(name ="parent")  
    @Cacheable  
    public class Parent extends IdEntity {  
          
        private static final long serialVersionUID = 1L;  
        private String name;  
        private List<Children> clist;  
          
        public String getName() {  
            return name;  
        }  
        public void setName(String name) {  
            this.name = name;  
        }  
          
        @OneToMany(fetch = FetchType.EAGER,mappedBy = "parent")  
            @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)  
        public List<Children> getClist() {  
            return clist;  
        }  
        public void setClist(List<Children> clist) {  
            this.clist = clist;  
        }  
    }  
      
    @Entity  
    @Table(name ="children")  
    @Cacheable  
    public class Children extends IdEntity{  
      
        private static final long serialVersionUID = 1L;  
        private String name;  
        private Parent parent;  
          
        @ManyToOne(fetch = FetchType.LAZY)  
        @JoinColumn(name = "parent_id")  
        public Parent getParent() {  
            return parent;  
        }  
      
        public void setParent(Parent parent) {  
            this.parent = parent;  
        }  
      
        public String getName() {  
            return name;  
        }  
      
        public void setName(String name) {  
            this.name = name;  
        }     
    }  


    测试方法: 
    Java代码 
    private void cellectionCacheTest(){  
            EntityManager em1 = emf.createEntityManager();  
            Parent p1 = em1.find(Parent.class, 1);  
            List<Children> c1 = p1.getClist();  
            em1.close();  
            System.out.println(p1.getName()+" ");  
            for (Children children : c1) {  
                System.out.print(children.getName()+",");  
            }  
            System.out.println();  
            EntityManager em2 = emf.createEntityManager();  
            Parent p2 = em2.find(Parent.class, 1);  
            List<Children> c2 = p2.getClist();  
            em2.close();  
            System.out.println(p2.getName()+" ");  
            for (Children children : c2) {  
                System.out.print(children.getName()+",");  
            }  
            System.out.println();  
        }  

    输出: 
    Java代码
    Hibernate: ********************  
    Michael   
    kate,Jam,Jason,Brain,  
    Michael   
    kate,Jam,Jason,Brain,  
    ===================L2======================  
    com.restjplat.quickweb.model.Children : 4  
    com.restjplat.quickweb.model.Dict : 0  
    org.hibernate.cache.spi.UpdateTimestampsCache : 0  
    com.restjplat.quickweb.model.Parent.clist : 1  
    org.hibernate.cache.internal.StandardQueryCache : 0  
    com.restjplat.quickweb.model.Parent : 1  
    =================query cache=================  



    在统计数据里可见二级缓存的对象数量。 

    本文我们不讨论关于缓存的更新策略,脏数据等等的东西,只是讲解配置方式。 

    接下来是源代码篇 理清楚各种配置以后,我们来看一下hibernate和spring-data-jpa的一些缓存实现源代码。 

    上面有个遗留问题,为什么spring-data-jpa默认实现的findAll()方法无法保存到查询缓存?只能啃源代码了。 

    打断点跟踪吧 入口方法是spring-data-jpa里的 SimpleJpaRepository类 

    Java代码
    public List<T> findAll() {  
            return getQuery(null, (Sort) null).getResultList();  
        }  
      
    然后到 QueryImpl<X>类的  
    private List<X> list() {  
            if (getEntityGraphQueryHint() != null) {  
                SessionImplementor sessionImpl = (SessionImplementor) getEntityManager().getSession();  
                HQLQueryPlan entityGraphQueryPlan = new HQLQueryPlan( getHibernateQuery().getQueryString(), false,  
                        sessionImpl.getEnabledFilters(), sessionImpl.getFactory(), getEntityGraphQueryHint() );  
                // Safe to assume QueryImpl at this point.  
                unwrap( org.hibernate.internal.QueryImpl.class ).setQueryPlan( entityGraphQueryPlan );  
            }  
            return query.list();  
        }  
      
    进入query.list();  
      
    query类的代码解析google一下很多,于是直接到最后:  
      
    进入QueryLoader的list方法。  
      
    protected List list(  
                final SessionImplementor session,  
                final QueryParameters queryParameters,  
                final Set<Serializable> querySpaces,  
                final Type[] resultTypes) throws HibernateException {  
      
            final boolean cacheable = factory.getSettings().isQueryCacheEnabled() &&  
                queryParameters.isCacheable();  
      
            if ( cacheable ) {  
                return listUsingQueryCache( session, queryParameters, querySpaces, resultTypes );  
            }  
            else {  
                return listIgnoreQueryCache( session, queryParameters );  
            }  
        }  

    果然有个cacheable,值为false,说明的确是没有从缓存里取数据。 

    用自定义的jpa查询方法测试后发现,这个值为true。 

    于是接着看cacheable的取值过程: 


    Java代码
    final boolean cacheable = factory.getSettings().isQueryCacheEnabled() &&  queryParameters.isCacheable();  

    factory.getSettings().isQueryCacheEnabled() 这个一定是true,因为是在配置文件中打开的。那只能是queryParameters.isCacheable() 这个的问题了。 

    Java代码 
    在query.list()的方法内部:  
      
    public List list() throws HibernateException {  
            verifyParameters();  
            Map namedParams = getNamedParams();  
            before();  
            try {  
                return getSession().list(  
                        expandParameterLists(namedParams),  
                        getQueryParameters(namedParams)  
                    );  
            }  
            finally {  
                after();  
            }  
        }  
      
    getQueryParameters(namedParams)这个方法实际获取的是query对象的cacheable属性的值,也就是说,query对象新建的时候cacheable的值决定了这个query方法能不能被查询缓存。  

    接下来query的建立过程: 

    Java代码 
    在 SimpleJpaRepository 类中 return applyLockMode(em.createQuery(query));  
      
    直接由emcreate,再跟踪到 AbstractEntityManagerImpl中  
      
    @Override  
        public <T> QueryImpl<T> createQuery(  
                String jpaqlString,  
                Class<T> resultClass,  
                Selection selection,  
                QueryOptions queryOptions) {  
            try {  
                org.hibernate.Query hqlQuery = internalGetSession().createQuery( jpaqlString );  
      
                ....  
                return new QueryImpl<T>( hqlQuery, this, queryOptions.getNamedParameterExplicitTypes() );  
            }  
            catch ( RuntimeException e ) {  
                throw convert( e );  
            }  
        }  
    即通过session.createQuery(jpaqlString ) 创建初始化对象。  
      
    在query类定义中  
    public abstract class AbstractQueryImpl implements Query {  
      
            private boolean cacheable;  
    }  
    cacheable不是对象类型,而是基本类型,所以不赋值的情况下默认为“false”。  

    也就是说spring-data-jpa接口提供的简单快速的各种接口实现全是不能使用查询缓存的,完全不知道为什么这么设计。 

    接下来看看我们自己实现的查询方法实现: 

    直接找到query方法的setCacheable()方法打断点,因为肯定改变这个值才能有查询缓存。 

    Java代码 
    于是跟踪到 SimpleJpaQuery类中  
    protected Query createQuery(Object[] values) {  
            return applyLockMode(applyHints(doCreateQuery(values), method), method);  
    }  

    在返回query的过程中通过applyHints()方法读取了方法上的QueryHint注解从而设置了查询缓存。
    展开全文
  • 区块链概念

    千次阅读 2018-06-08 17:16:00
    、价值转移的本质 三、什么是比特币 3.1 诞生 3.2 技术解决方案 3.3 比特币的发行模式 四、什么是区块链 定义 五、比特币与区块链的关系 六、区块链的类型与特点 6.1 公有链 6.2 私有链 6.3 联盟链 七、...

    区块链概念

    目 录

    一、区块链产生背景

    【楔子】

    任何事物的发展,从来不是一蹴而就的。
    商贸合作中签订的合同,怎么确保对方能遵守和执行?
    餐厅宣称刚从海里打捞上来的三文鱼,怎么证明捕捞时间和运输中的卫生?
    数字世界里,怎么证明你对资产的所有?
    囚徒困境中的两个人,怎样能达成利益的最大化?
    宇宙不同文明之间的猜疑链,有没有可能打破?
    这些看似很难解决的问题,在区块链的世界里已经有了初步的答案

    区块链是比特币的一个重要概念,其初始使命是为了支持比特币的形成和流通。在比特币诞生之前,互联网的TCP/IP协议,基本实现了全球信息传递高速低成本的传输,而有一类特殊的信息——货币则无法在上面进行高速传输。本质原因在于,传统互联网是信息互联网,而不是价值互联网。

    随着互联网开始进入人类生活的各个层面,我们发现有些信息是无法复制的,或者说复制是没有意义的。比如货币支付,我们不能把要支付的钱直接复制到对方账户上,而是一定要在付款账户上减去若干资金,然后在收款账户上增加若干资金。只有这样,这个支付行为才是有意义的,而不像新闻类信息,我们复制一份到新的网站上,就有了两份信息,可以让更多的人来进行分享。而这些不能分享,只能转移的信息,往往具有更大的价值,在它的背后需要有信用作背书,从而产生价值。因此,可以发现,我们的“信息互联网”非常善于处理“信息分享”,而不能解决“价值转移”或者说“信用”这件事情。

    目前互联网本身的协议并不支持这个“价值转移”功能。互联网TCP/IP协议无法确认当信息发出去后本地的数据是否会精确改变,而某单点的数据篡改在现有的互联网系统中是很难被全网发现的。由此促进了继大型机,PC机,互联网,移动互联网后的第五次颠覆性创新“价值互联网”————区块链技术的兴起。

    二、价值转移的本质

    在没有解决价值转移问题之前,我们必须使用中介系统来完成这样的“价值转移”行为,于是我们看到了类似于支付宝、贝宝(Paypal)的第三方支付工具开始崛起。而在跨国汇款领域,大家更多的是通过类似于SWIFT(环球同业银行金融电讯协会)这样的中介机构来完成跨国汇款结算和清算。

    互联网中也有各种各样的金融体系,也有许多政府银行或者第三方提供的支付系统,但是它还是依靠中心化的方案来解决。所谓中心化的方案,就是通过某个公司或者政府信用作为背书,将所有的价值转移计算放在一个中心服务器(集群)中,尽管所有的计算也是由程序自动完成的, 但是却必须信任这个中心化的人或者机构。事实上,通过中心化的信用背书来解决,也只能将信用局限在一定的机构、地区或者国家的范围之内。 由此可以看出,要解决这个根本问题,就必须建立“信用”。所以价值转移的核心问题其实就是跨国信用共识问题。也就是信任问题。

    但根据历史经验来看,整个系统中往往最不可信任的就是人,或者由人组成的机构或政府,历史往往最终被证明,那些违反原规则的人就是规则制定者,而从工业革命到互联网革命,技术发展的潮流也是通过取代人这个最不可靠、最脆弱且效率最低的环节来实现生产力大发展的。所以,归根结底,要真正完成以信用共识为基础的价值转移,需要一个能够取代第三方中介的方式,一个能够自动运行的方式,且具备去信任的机制(不需要依靠相信环节中的任何人或机构)的机制来完成价值的转移。

    在如此纷繁复杂的全球体系中,要凭空建立一个全球性的信用共识体系是很困难的,由于每个国家的政治、经济和文化情况不同,两个国家的企业和政府建立完全互信几乎是不可能做到的,这也就意味着无论是以个人或以企业、政府的信用进行背书,对于跨国的价值交换即使可以完成, 但也需要很长的时间和高昂的经济成本。区块链的诞生为我们提供一种思路:我们可以通过计算机编程,依赖科学的密码学算法来实现信任问题。

    三、什么是比特币

    3.1 诞生

    一个真正的点对点电子现金应该满足发起方直接在线支付给对方,而不需要通过第三方的金融服务机构。现有的电子现金支付手段仍然需要经过一个可以信任的第三方机构来防止电子现金的“双重支付”,那就丧失了电子现金给人类带来的最大好处 。

    比特币是在这种背景下,由署名中本聪(SatoshiNakamoto)的人在2008年发明的,他当时出版了一篇题为《比特币:一种点对点的电子现金系统》(“Bitcoin:A Peer-to-Peer Electronic Cash System”)的文章。
    中本聪结合了诸如b-money和HashCash等电子货币的发明,创建了一个完全去中心化的电子现金系统,它不依赖中央机构进行货币发行或结算和验证交易。

    比特币是基于密码学和经济博弈的一种数字货币,也是历史上首个经过大规模长时间运作检验的数字货币系统。

    3.2 技术解决方案

    我们在此提出一种解决方案,使现金系统在点对点的环境下运行,并防止双重支付问题。该网络通过随机散列(hashing)对全部交易加上时间戳(timestamps),将它们合并入一个不断延伸的基于随机散列的工作量证明(proof-of-work)的链条作为交易记录,除非重新完成全部的工作量证明,形成的交易记录将不可更改。最长的链条不仅将作为被观察到的事件序列(sequence)的证明,而且被看做是来自CPU计算能力最大的池(pool)。只要大多数的CPU计算能力都没有打算合作起来对全网进行攻击,那么诚实的节点将会生成最长的、超过攻击者的链条。这个系统本身需要的基础设施非常少。信息尽最大努力在全网传播即可,节点(nodes)可以随时离开和重新加入网络,并将最长的工作量证明链条作为在该节点离线期间发生的交易的证明。

    3.3 比特币的发行模式

    区块链发布链上的数字货币有两种主要形式。一种是,以国内的NEO为例,NEO的发行模式是:在系统创建的时候,一次性的在创世区块里,写入1亿个NEO。借助ICO,用户可以直接用人民币认购持有。这种模式比较类似于央行发行人民币。

    另一种就是类似于淘金,就是比特币这样的,通过挖矿节点,不断消耗自身的算力,来换取比特币。这里的挖矿可以简单理解为猜数字谜语,计算机通过消耗自身的计算能力来进行猜数字谜语。谁先才对然后公布到网络上就可以获取一份奖励。

    由于比特币系统是完全开源的,在开源的代码里包含了挖矿的功能,只要一个人懂代码,就可以把这套代码进行编译部署,加入到比特币网络里面去,把挖矿功能开启,那你的宿主机开始挖矿了。

    在比特币系统,通过自身的算法可以动态调整全网节点的挖矿难度,保证每过大约10分钟,比特币网络中,就会有一个节点挖矿成功;一旦有人挖矿成功,比特币系统就会奖励此人一定数量的比特币,这个数量也是通过算法控制的。

    具体说来:从2009年开始,头四年挖矿奖励是50个比特币,在接下来的每四年,每个挖矿成功的人会得到25个比特币的奖励,每过四年衰减一半;也就是下一个四年挖矿成功奖励12.5个,再下一个四年奖励6.25个,以此类推。大约到2140年的时候,区块链发行完毕,大约2100万个比特币,这就是比特币的总量,所以不会无限增加下去。

    四、什么是区块链

    定义

    区块链本质上是一个去中心化的数据库,是一连串使用密码学方法产生相关联的数据块,每一个数据块中包含了一段时间内全网交易的信息,用于验证其信息的有效性(防伪)和生成下一个区块。所以说区块链是以去中心化和去信任化的方式,来集体维护一个可靠数据库的技术方案。

    通俗地说,其实区块链可以称为一种全民记账的技术,或者说可以理解为一种分布式总账技术。

    【例子】
    数据库是大家都熟悉的概念,任何的网站或者系统背后都有一个数据库,我们可以把数据库想象为一个账本,例如支付宝数据库就像是一个巨大的账本,里面记录每个人账上有多少钱。当A发送给B—元钱,那么就要把A账上的钱扣除一元,在B的账上增加一元,这个数据的变动就可以 理解为一种记账行为。对一般中心化的结构来说,微信背后的数据库由腾讯的团队来维护,淘宝背后的数据库由阿里的团队来维护,这是很典型的中心化数据库管理方式,也是大家认为顺理成章的事情。

    但是区块链完全颠覆了这种方式。一个区块链系统由许多节点构成,这些节点一般就是一台计算机。在该系统中,每个参与的节点都有机会去竞争记账,即更新数据库信息。系统会在一段时间内(可能是十分钟,也可能是一秒钟),选出其中记账最快最好的一个节点,让它在这段时间里记账。它会把这段时间内数据的变化记录在一个数据区块(block)中,我们可以把这个数据区块想象成一页纸。在记完账以后,该节点就会把这一页的账本发给其他节点。其他节点会核实这一页账本是否无误,如果没有问题就会放人自己的账本中,在系统里面,这一页账本的数据表现形式,称为区块,该区块中就记录了整个账本数据在这段时间里的改变。然后把这个更新结果发给系统里的每一个节点。于是,整个系统的每个节点都有着完全一样的账本。

    我们把这种记账方式称为区块链技术或者分布式总账技术。

    五、比特币与区块链的关系

    比特币是最早的数字货币,基于比特币的底层设计思想,衍生出了区块链的概念。而基于区块链这项技术,人们设计了更多的数字货币。而比特币本身,又是最早的数字货币。

    区块链是一串使用密码学方法相关联产生的数据块。在比特币的应用中,整个区块链就是比特币的公共账本,网络中的每一个节点都有比特币交易信息的备份。当发起一个比特币交易时,信息被广播到网络中,通过算力的比拼而获得合法记账权的矿工将交易信息记录成一个新的区块连接到区块链中,一旦被记录,信息就不能被随意篡改。比特币是区块链的一个“杀手级应用”,区块链是比特币的底层技术,且作用绝不仅仅局限在比特币上。因此,尽管比特币与区块链经常被同时提及,但二者并不能画上等号。

    目前,对区块链的认识还存在不少误区:
    首先,区块链不是数据库。虽然区块链也可以用来存储数据,但它要解决的问题是多方的互信问题。单纯从存储数据角度,它的效率可能不高,我们也不推荐把大量的原始数据放到区块链上。
    其次,区块链不是要颠覆现有技术。作为基于多项已有技术而出现的新事物,区块链跟现有技术的关系是一脉相承的,在解决多方合作和可信处理上多走了一步,但并不意味着它将彻底颠覆已有的商业模式。很长一段时间里,区块链的适用场景仍需摸索,跟已有系统必然是合作共存的关系。

    六、区块链的类型与特点

    6.1 公有链

    所谓公有链,顾名思义,任何人都可以参与使用和维护,典型的如比特币区块链,信息是完全公开的。是指全世界任何人都可以在任何时候加入、任意读取数据,任何人都能发送交易且交易能获得有效确认,任何人都能参与其中共识过程的区块链——共识过程决定哪个区块可被添加到区块链中和明确当前状态。作为中心化或者准中心化信任的替代物,公有链的安全由“共识机制”来维护——“共识机制”可以采取PoW或PoS等方式,将经济奖励和加密算法验证结合了起来,并遵循着一般原则:每个人从中可获得的经济奖励与对共识过程做出的贡献成正比。这些区块链通常被认为是“完全去中心化”的。
    在公有链中,程序开发者无权干涉用户,所以区块链可以保护使用他们开发的程序的用户。

    6.2 私有链

    所谓私有链,则是集中管理者进行限制,只能得到内部少数人可以使用,信息不公开。
    大多数人一开始很难理解私有链存在的必要性,认为其和中心化数据库没有太大的区别,甚至还不如中心化数据库的效率高。事实上,中心化和去中心化永远是相对的,私有链可以看作是一个小范围系统内部的公有链,如果从系统外部来观察,可能觉得这个系统还是中心化的,但是以系 统内部每一个节点的眼光来看,其实当中每个节点的权利都是去中心化。而对于公有链,从某种程度来看也可以看作是地球上的私有链,只有地球人的电脑系统才可以接人。因此,私有链完全是有其存在价值的。
    私有链的巨大优势就是,由于对于P2P这样的网络系统而言,系统内部的处理速度往往取决于最弱的节点,而私有链所有的节点和网络环境都是完全可以控制的,因此能够确保私有链在处理速度方面远远优于公有链。

    私有链和公有链另外一个巨大的区别就是,一般公有链肯定在内部会有某种代币(token),而私有链却是可以选择没有代币的设计方案。对于公有链而言,如果要让每个节点参与竞争记账,必定需要设计一种奖励制度,鼓励那些遵守规则参与记账的节点。而这种奖励往往就是依靠代币系统来实现的。但是对于私有链而言,基本上都是属于某个机构内部的节点,对于这些节点而言,参与进行记账本身可能就是该组织或者机构上级的要求,对于他们而言本身就是工作的一部分,因此并不是一定需要通过代币奖励机制来激励每个节点进行记账。所以,我们也可以发现,代币系统并不是每个区块链必然需要的。因此,考虑到处理速度及账本访问的私密性和安全性,越来越多的企业在选择区块链方案时,会更多地倾向于选择私有链技术。

    6.3 联盟链

    联盟链(Consortium Blockchain)介于共有链和私有链两者之间,由若干组织一起合作维护一条区块链,该区块链的使用必须是有权限的管理,相关信息会得到保护,典型如银联组织是指其共识过程受到预选节点控制的区块链。

    七、区块链的发展历程

    区块链开始引人注目与比特币的风靡密切相关。直至今日,ETH币、 EOS币等类型的比特币层出不穷,人们对于电子货币的关注已经转向了对区块链的深人研究。区块链强大的容错功能,使得它能够在没有中心化服务器和管理的情况下,安全稳定地传输数据。从诞生到现在,区块链专家梅兰妮•斯沃恩(Melanie Swan)将区块链发展划分为三个阶段:区块链 1.0、区块链2.0、区块链3.0

    7.1 区块链1.0:以比特币为代表的可编程货币

    比特币设计的初衷,是为了构建一个可信赖的、自由、无中心、有序的货币交易世界,尽管比特币出现了价格剧烈波动、挖矿产生的巨大能源消耗、政府监管态度不明等各种问题,但可编程货币的出现让价值在互联网中直接流通交换成为可能,可编程的意义是指通过预先设定的指令,完成复杂的动作,并能通过判断外部条件做出反应。可编程货币即指定某些货币在特定时间的专门用途,这对于政府管理专款专用资金等有着重要意义。

    区块链是一个全新的数字支付系统,其去中心化、基于密钥的毫无障碍的货币交易模式,在保证安全性的同时也大大降低了交易成本,对传统的金融体系可能产生颠覆性影响,也刻画出一幅理想的交易愿景——全球货币统一,使得货币发行流通不再依靠各国央行。区块链1.0设置了货币的全新起点,但构建全球统一的区块链网络却还有很长的路要走。

    7.2 区块链2.0:基于区块链的可编程金融

    数字货币的强大功能吸引了金融机构采用区块链技术幵展业务,人们试着将“智能合约”加入区块链形成可编程金融。目前,可编程金融已经在包括股票、私募股权等领域有了初步的应用,包括目前交易所积极尝试用区块链技术实现股权登记、转让等功能;华尔街银行通过联合打造区块链行业标准,提高银行结算支付的效率,降低跨境支付的成本。

    目前商业银行基于区块链的应用领域主要有:
    - 一是点对点交易。如基于P2P的跨境支付和汇款、贸易结算以及证券、期货、金融衍生品合约的买卖等。
    - 二是登记。区块链具有可信、可追溯的特点,因此可作为可靠的数据库来记录各种信息,如运用在存储反洗钱客户身份资料及交易记录上。
    - 三是确权。如土地所有权、股权等合约或财产的真实性验证和转移等。
    - 四是智能管理。即利用“智能合同”自动检测是否具备生效的各种环境,一旦满足了预先设定的程序,合同会得到自动处理,比如自动付息、 分红等。

    目前,包括商业银行在内的金融机构都幵始研究区块链技术并尝试将其运用到实践中,也许现有的传统金融体系正在逐渐被区块链技术所颠覆。

    7.3 区块链3.0:区块链在其他行业的应用

    除了金融行业,区块链在其他领域也开始应用。在法律、零售、物联、医疗等领域,区块链可以解决信任问题,不再依靠第三方来建立信用和信息共享,提高整个行业的运行效率和整体水平。 极高的生产力会将所有的人和机器连接到一个全球性的网络中,人类向商品和服务近乎免费的时代加速迈进,区块链的去中心化协同共享模式将成为主导经济生活的新模式。

    现在我们所说的区块链1.0、区块链2.0、区块链3.0,也许有人感觉这是一种递进的演化,但事实上仅仅是应用范围的不同而已,从区块链1.0到区块链3.0都是平行的发展阶段,在各自的领域内发挥应有的作用。通过区块链技术,能够让人类生活在许多应用和工具中,进入“可编程”状态和智能状态,完成非常复杂的操作。

    目前,区块链建立去中心化信用的尝试,已经不限于金融界,而被社会各个领域关注,在目前社会的公信力普遍不足的情况下,区块链更能为社会管理提供一种全新的思路和技术选项。比特币的成功和金融领域的尝试性运用,使社会对区块链的关注度和投资热度急剧提升,区块链技术的发展进入黄金时期。

    区块链飞速发展描绘了世界基于技术的统一愿景,整个社会有望进入智能互联网时代,形成一个可编程的社会。在这个信用已经成为紧缺资源的时代,区块链的技术创新作为一种分布式信用的模式,为全球市场的金融、社会管理、人才评价和去中心化组织建设等提供了一个广阔的发展。

    八、区块链的解决问题

    现代商业的典型模式为,交易方通过协商和执行合约,完成交易过程。而区块链擅长的正是如何管理合约,确保合约的顺利执行。

    根据类别和应用场景不同,区块链所体现的特点和价值也不同。从技术特点上,区块链一般被认为具有:
    - 分布式容错性:网络极其鲁棒,容错 1/3 左右节点的异常状态
    - 不可篡改性:一致提交后的数据会一直存在,不可被销毁或修改
    - 隐私保护性:密码学保证了未经授权者能访问到数据,但无法解析

    随之带来的业务特性将可能包括:

    • 可信任性:区块链技术可以提供天然可信的分布式账本平台,不需要额外第三方中介机构
    • 降低成本:跟传统技术相比,区块链技术可能带来更短的时间、更少的人力和维护成本
    • 增强安全:区块链技术将有利于安全可靠的审计管理和账目清算,减少犯罪可能性和各种风险

    区块链并非凭空诞生的新技术,更像是技术演化到一定程度突破应用阈值后的产物,因此,其商业应用场景也跟促生其出现的环境息息相关。基于区块链技术,任何基于数字交易的活动成本和追踪成本都会降低,并且能提高安全性。

    九、区块链的应用场景

    区块链最近几年炒得很热,国内已有大量与之相关的企业,有些企业已经结合已有业务摸索出了自己的应用场景,但仍有不少企业处于不断试探和反复迷惑状态。

    实际上,要找到合适的应用场景,还是要从区块链自身的特性出发进行分析。区块链在不引入第三方中介机构的前提下,可以提供去中心化、不可篡改、安全可靠等特性保证。因此,所有直接或间接依赖于第三方担保信任机构的活动,均可能从区块链技术中获益。

    未来几年内,可能深入应用区块链的场景将包括:

    • 金融服务:主要是降低交易成本,减少跨组织交易风险等。该领域的区块链应用将最快成熟起来,银行和金融交易机构将是主力推动者。

    • 征信和权属管理:这是大型社交平台和保险公司都梦寐以求的,目前还缺乏足够的数据来源、可靠的平台支持和有效的数据分析和管理。该领域创业的门槛极高,需要自上而下的推动。

    • 资源共享:airbnb(爱彼迎,千万用户好评的全球民宿预订平台)为代表的公司将欢迎这类应用,极大降低管理成本。这个领域创业门槛低,主题集中,会受到投资热捧。

    • 投资管理:无论公募还是私募基金,都可以应用区块链技术降低管理成本和管控风险。虽然有 DAO 这样的试水,谨慎认为该领域的需求还未成熟。

    • 物联网与供应链:物联网是很适合的一个领域,短期内会有大量应用出现,特别是租赁、物流等特定场景。但物联网自身的发展局限将导致短期内较难出现规模应用。

    当然,短期内部分场景可能还难以实现,但区块链技术的正确应用会促进这些行业的发展。

    数字内容领域一直是移动互联网巨头公司的必争之地,区块链技术在数字内容领域的落地能够创造更多普惠大众的应用场景。目前区块链还处于初级发展阶段,出现了很多公链,但能有效支持数字资源传递的公链尚未出现,无法承载各种丰富的网站服务类型,尤其是在数据存储、数据服务质量、内容付费模式等方面存在诸多问题。

    参考文献:https://www.btctrade.com/bitcoin/2066.html

    展开全文
  • Java工程师书单(初级、中级、高级)

    千次阅读 多人点赞 2017-08-02 13:37:01
    怎样学习才能从一名Java初级程序员成长为一名合格的架构师,或者说一名合格的架构师应该有怎样的技术知识体系,这是不仅一个刚刚踏入职场的初级程序员也是工作一两年之后开始迷茫的程序员经常会问到的问题 ...

    简介

    怎样学习才能从一名Java初级程序员成长为一名合格的架构师,或者说一名合格的架构师应该有怎样的技术知识体系,这是不仅一个刚刚踏入职场的初级程序员也是工作一两年之后开始迷茫的程序员经常会问到的问题

    笔者完全从自身的自学经历出发,以初学者的视角挑选出如下的这些图书。

    初级书单

    《编写高质量代码——改善Java程序的151个建议》

    Java工程师书单(初级、中级、高级)

    这是一本值得入门java的人放在床头的书。此书内容广泛、要点翔实。大多数优秀程序设计书籍都需要看老外写的,但是这本讲述提高java编程水平的书还是不错的,适合具有基本java编程能力的人。

    对于程序猿而言,工作久了,就感觉编程习惯对一个人很重要。习惯好,不仅工作效率告,而且bug少。这本书对提高个人的好的编程习惯很有帮助。

    《Java程序员修炼之道》

    Java工程师书单(初级、中级、高级)

    此书涵盖了Java7的新特性和Java开发的关键技术,对当前大量开源技术并存,多核处理器、并发以及海量数据给Java开发带来的挑战作出了精辟的分析,提供了实践前沿的深刻洞见,涉及依赖注入、现代并发、类与字节码、性能调优等底层概念的剖析。

    书中的道理很浅显,可是对于菜鸟却是至理名言。基本为你勾勒了一个成熟软件程序员专家所需要的所有特性。我自觉地获益颇多,其中很多事情,要么在当时是自己没有想到的,要么是发生了,自己没有注意的等等。给我影响很大。

    《Java8实战》

    Java工程师书单(初级、中级、高级)

    本书全面介绍了Java 8 这个里程碑版本的新特性,包括Lambdas、流和函数式编程。有了函数式的编程特性,可以让代码更简洁,同时也能自动化地利用多核硬件。全书分四个部分:基础知识、函数式数据处理、高效Java 8 编程和超越Java 8,清晰明了地向读者展现了一幅Java 与时俱进的现代化画卷。

    这是了解lambda 表达式最好的入门书籍了。在网上也学习了lambda 表达式,感觉会用,就是不知道原理,稍微换一下场景又不会用了。这本书绝对是学习java8新特性的最好书籍。

    《有效的单元测试》

    Java工程师书单(初级、中级、高级)

    此书由敏捷技术实践专家撰写,系统且深入地阐释单元测试用于软件设计的工具、方法、原则和佳实践;深入剖析各种测试常见问题,包含大量实践案例,可操作性强,能为用户高效编写测试提供系统实践指南。

    介绍了单元测试的各个方面,TDD、test double、测试的坏味道、可测试的设计等等,每个主题需要深入的话,还需要配合其它书籍和实践,非常适合入门单元测试。书中例子非常全面,看完对使用 Junit 进行单元测试会有一个大的长进,而且用java语言编写,内容很新。

    《Java核心技术:卷2 高级特性》

    Java工程师书单(初级、中级、高级)

    此书系统全面地讲解Java语言的核心概念、语法、重要特性和开发方法。本书全面覆盖Java技术的高级主题,包括流与文件、XML、网络、数据库编程、国际化等,详细描述了图形与GUI编程,还涉及安全、远程方法、注解处理、本地方法等。本书对Java技术的阐述精确到位,叙述方式深入浅出,并包含大量示例代码,能够帮助读者充分理解Java语言并灵活应用。

    卷二虽然是高级特性,但是其中的io、文件系统、正则表达式、网络、jdbc也是日常编程中非常常用的组件,不可不看。此书是一本非常轻松的Java技术书,不仅原文写得好,译者翻译的也非常流畅。在我对翻译的书绝对无望的时候,它力挽狂澜的告诉我,事情还没有坏到这个地步。

    《代码整洁之道》

    Java工程师书单(初级、中级、高级)

    代码质量与其整洁度成正比。干净的代码,既在质量上较为可靠,也为后期维护、升级奠定了良好基础。作为编程领域的佼佼者,本书作者给出了一系列行之有效的整洁代码操作实践。这些实践在本书中体现为一条条规则(或称“启示”),并辅以来自现实项目的正、反两面的范例。只要遵循这些规则,就能编写出干净的代码,从而有效提升代码质量。

    如果每个例程都让你感到深合己意,那就是整洁代码。 如果代码让编程语言看起来像是专为解决那个问题而存在,就可以称之为漂亮的代码。

    《数据结构与算法分析-Java语言描述》

    Java工程师书单(初级、中级、高级)

    本书是java数据结构与算法方面的三宝之一,除了这三本其他的已经没有意义了。这三宝分别是:

    * 黑宝书《数据结构与算法分析java语言描述》mark allen weiss

    * 蓝宝书《java数据结构和算法》robert lafore

    * 红宝书《算法》robert sedgewick

    黑宝书胜在公式推理和证明以及算法的简洁和精炼,此外习题较多。蓝宝书胜在对算法的深入浅出的讲解,演示和举例,让艰涩的理论变得很容易理解。红宝书胜在系出名门斯坦福,演示通俗易懂,内容丰富。有了这三宝,算法不用愁,学完以后再看《算法导论》就容易多了。

    本书从讲解什么是数据结构开始,延伸至高级数据结构和算法分析,强调数据结构和问题求解技术。本书的目的是从抽象思维和问题求解的观点提供对数据结构的实用介绍,试图包含有关数据结构、算法分析及其Java实现的所有重要的细节

    中级书单

    《重构:改善既有代码的设计》

    Java工程师书单(初级、中级、高级)

    重构,绝对是写程序过程中最重要的事之一。在写程序之前我们不可能事先了解所有的需求,设计肯定会有考虑不周的地方,而且随着项目需求的修改,也有可能原来的设计已经被改得面目全非了。更何况,我们很少有机会从头到尾完成一个项目,基本上都是接手别人的代码,我们要做的是重构,从小范围的重构开始。

    重构是设计,设计是art,重构也是art. 一个函数三行只是语不惊人死不休的说法,是对成百上千行代码的矫枉过正。 更一个般的看法是一个函数应该写在一页纸内。

    《Effective Java》

    Java工程师书单(初级、中级、高级)

    这样一本书本该早就读了,然而最近才看完。看完觉得对于一些编程规则深层的原理有了一些认识。之前我只是知道这些口口相传的规则,却不知道为什么,在这本书中找到了一些答案。书中涉及到了java编程方方面面的规则,包括类、接口、创建对象、类中的函数、函数的参数、异常。

    如果你使用刚刚学会的Java做了一个小应用程序,那么你就可以开始有选择地看这本书。书中分别对Java的不同特性分章节给予作者本人的建议。如果你还没有用到其中的某一特性,那么就没必要读相关的章节,跳过去。只有你经历过了,摔倒过了,困扰过了,你才会与书中的建议产生共鸣

    《Java并发编程实战》

    Java工程师书单(初级、中级、高级)

    本书深入浅出地介绍了Java线程和并发,是一本完美的Java并发参考手册。书中从并发性和线程安全性的基本概念出发,介绍了如何使用类库提供的基本并发构建块,用于避免并发危险、构造线程安全的类及验证线程安全的规则,如何将小的线程安全类组合成更大的线程安全类,如何利用线程来提高并发应用程序的吞吐量。

    java进阶必看,多线程的最佳书籍。

    《实战Java高并发程序设计》

    Java工程师书单(初级、中级、高级)

    此书主要介绍基于Java的并行程序设计基础、思路、方法和实战。首先,立足于并发程序基础,详细介绍Java中进行并行程序设计的基本方法。第二,进一步详细介绍JDK中对并行程序的强大支持,帮助读者快速、稳健地进行并行程序开发。第三,详细讨论有关“锁”的优化和提高并行程序性能级别的方法和思路。第四,介绍并行的基本设计模式及Java8对并行程序的支持和改进。第五,介绍高并发框架Akka的使用方法。最后,详细介绍并行程序的调试方法。

    在集群和分布式环境下,java内置锁逐渐失去了用武之地,但是锁和并发的思想还是通用而且值得学习的。看过java并发编程实战以后再读这本书,每一个知识点都比较精炼而且代码示例简单易懂,没有晦涩难懂的翻译词,手绘图也有一种亲切感。缺点是没有附源码,需要自己去github上找。

    《算法》

    Java工程师书单(初级、中级、高级)

    个人觉得是我见过的最简单易懂的算法入门书籍。以前搜刮过几本算法竞赛书,但是难度终归太大。本书使用Java语言实现算法,配有大量的图解,没有一句难懂的话,而且全都是模块化实现。讲的都是实用算法,没有那些高大上听着名字就让人感到很害怕的东西,个人觉得比CLRS实用性要强,更加适合入门的学习。

    此书力图研究当今最重要的计算机算法并将一些最基础的技能传授给广大求知者。它适合用做计算机科学进阶教材,面向已经熟悉了计算机系统并掌握了基本编程技能的学生。本书也可用于自学,或是作为开发人员的参考手册,因为书中实现了许多实用算法并详尽分析了它们的性能特点和用途。这本书取材广泛,很适合作为该领域的入门教材。

    《Head First 设计模式》

    Java工程师书单(初级、中级、高级)

    这是我看过最幽默最搞笑最亲切同时又让我收获巨大的技术书籍! 森森的膜拜Freeman(s)!Amen! 深入浅出,娓娓道来,有的地方能笑死你!写得很有趣,图文并茂,比起四人帮的那本,好懂了不知道多少倍。计算机世界的head first系列基本都是经典。不过只看书学明白设计模式是不可能的,这些只是前人的总结,我们唯有实践实践再实践了。

    读这本书不仅仅是学习知识,而是在学习一种思考的方法,学习一种认知的技巧,学习一种成长的阶梯。 总之,用你闲暇的时间来读这本书,并不亚于你专注的工作或学习。笔者强烈推荐此书,要成长为一名高级程序员,设计模式已经是必备技能了。

    《Java编程思想》

    Java工程师书单(初级、中级、高级)

    就是一本能够让Java程序员轻松面对挑战,并最终取得胜利的经典书籍。本书深入浅出、循序渐进地把我们领入Java的世界,让我们在不知不觉中就学会了用Java的思想去考虑问题、解决问题。本书并不适合Java的初学者,更适合于有经验的Java程序员,这正是本书的魅力所在。但是,书中并没有涵盖Java所有的类、接口和方法,因此,如果你希望将它当作Java的字典来使用,那么显然就要失望了。

    如果你开始觉得自己需要一些编程内功了,这本书就开始管用了,作为一本练习内功的基础书籍。把心静下来,老老实实打好内功根基,你会发现自己将会不一样,当然最直接的体现就是工资待遇上的。。从这本书开始,无论是走向架构,多线程或者虚拟机,路都会变得平坦很多。

    高级书单

    《深入理解Java虚拟机》

    Java工程师书单(初级、中级、高级)

    本书是近年来国内出版的唯一一本与Java虚拟机相关的专著,也是唯一一本同时从核心理论和实际运用这两个角度去探讨Java虚拟机的著作,不仅理论分析得透彻,而且书中包含的典型案例和最佳实践也极具现实指导意义。

    我对本书最大的感受就是:全面。作为一个刚开始接触 JVM 的人,我感觉本书基本上把 JVM 中所涉及的概念涵盖到。在阅读的过程中还有一种感受:如果作者不介绍某个内容,我在参考 Java 虚拟机的文档的时候可能不会考虑到有这样的因素存在,或者不会那么容易理解。作为一本全面的引人入门的书籍,这本书实在是很赞。

    《Java性能权威指南》

    Java工程师书单(初级、中级、高级)

    市面上介绍Java的书有很多,但专注于Java性能的并不多,能游刃有余地展示Java性能优化难点的更是凤毛麟角,本书即是其中之一。通过使用JVM和Java平台,以及Java语言和应用程序接口,本书详尽讲解了Java性能调优的相关知识,帮助读者深入理解Java平台性能的各个方面,使程序如虎添翼。

    为了理解gc那块看过来的,cms个人感觉讲的挺好的,和《深入理解java虚拟机》垃圾回收部分互为补充吧。有一点觉得挺赞:翻译的比较好,没有那种翻译腔!

    《深入分析Java Web技术内幕》

    Java工程师书单(初级、中级、高级)

    这本书的整体感觉不错,基本上是从基本原理介绍出发的。适合互联网技术爱好者阅读,也可以作为技术架构参考书籍。本书不仅是介绍了基本知识和原理,很多东西作者是站在系统架构的原理出发的,所以对爱好系统架构的读者是很有帮助的。本书的主要特点是“图文并茂,有图,有事实,有真相”,阅读起来不枯燥,晦涩。

    入行java两三年,说会但是对底层还是一知半解,遇到系统级问题就还是不知道怎么解决,所以要看深层次的书了,本书就是。

    《大型网站系统与Java中间件实践》

    Java工程师书单(初级、中级、高级)

    此书围绕大型网站和支撑大型网站架构的 Java 中间件的实践展开介绍。从分布式系统的知识切入,让读者对分布式系统有基本的了解;然后介绍大型网站随着数据量、访问量增长而发生的架构变迁;接着讲述构建 Java 中间件的相关知识;之后的几章都是根据笔者的经验来介绍支撑大型网站架构的 Java 中间件系统的设计和实践

    通过这本书可以学习到大量构建大型网站系统的核心技 术,以及支撑大型网站的Java中间件的必备知识。作者在超大型电子商务网站的多年实战经验使得本书的内容极具价值。 如果你所在的技术团队正在因面对大型网站而一筹莫展,或 许你可以从这本书中得到启发。另外,如果想成为Java技术架 构师,那么你也不应错过此书。

    《大型网站技术架构:核心原理与案例分析》

    Java工程师书单(初级、中级、高级)

    此书通过梳理大型网站技术发展历程,剖析大型网站技术架构模式,深入讲述大型互联网架构设计的核心原理,并通过一组典型网站技术架构设计案例,为读者呈现一幅包括技术选型、架构设计、性能优化、Web安全、系统发布、运维监控等在内的大型网站开发全景视图。

    本书从多个层面说明了如何构建一个高可用、高性能、高可扩展性的网站系统,并结合了阿里巴巴及其他互联网企业先进的架构实践经验进行案例分析,讲述非常全面且具指导意义。本书从网站的架构设计、快速开发、高效部署、业务监控、服务治理、运维管理等多个角度描述了架构设计的相关重点,涉及的核心技术包括前端优化、CDN、反向代理、缓存、消息队列、分布式存储、分布式服务、NoSQL存储、搜索、监控、安全等一系列保证大型网站安全可靠运行的关键技术点。本书还提供了网站如何从小型网站伴随用户成长,逐步扩展到大型网站的架构演进思路,是互联网架构师们不可多得的一本技术参考书。

    《企业应用架构模式》

    Java工程师书单(初级、中级、高级)

    招式套路可以千变万化,扎实深厚的“内功”却是始终如一!虽然企业应用涉及的软件技术不断翻新,但是基本的架构及设计思想却没有太多变化。将以前行之有效的设计思路和方法加以适当调整,并应用到当前的问题上,是最高效的做法。在一组专家级合作者的帮助下,Martin将40多种经常出现的解决方案转化成模式,最终融会成这本“内功心法”。在仔细研读、用心揣摩本书之后,希望它能够帮助你应对任何一种企业应用平台,驾驭任何一种企业应用技术—无论是现在的技术还是未来的技术。

    开始看这本书时,觉得讲的太抽象,草草的翻了一遍,很多东西只有一个浅浅的一个印象。后来在用hibernate的时候,偶尔又重新翻开这本书。书里讲的很多东西,都在hibernate里面有体现。尤其是讲关系映射那章,在hibernate文档里面都只讲怎么做,不讲为什么,在书里讲的很清楚,看了很有收获。

    《Expert One-on-One J2EE Development without EJB》

    Java工程师书单(初级、中级、高级)

    选择一种架构、一种技术的依据是什么?Rod Johnson认为,应该是基于实践的证据、来自历史项目或亲自试验的经验,而不是任何形式的偶像崇拜或者门户之见。书中谈到了企业应用方方面面的问题和解决办法,而这些方案无一不是这种“循证方法”的产物。除了把这些方案交给读者,Rod Johnson通过这本书希望传达的、更为重要的信息正是“循证”的工作方式——那原本就应该是程序员的工作方式。

    对Spring熟悉或者希望深入学习Spring框架精髓的工程师而言,本书必看,因为它就是是Spring框架发展的基石。

    总结

    最后,各位读者在阅读本系列书单的同时,也可以留言告诉笔者你认为的Java技术相关的好书籍,我会根据大家的留言情况及时更新本系列书单的内容。当然,如果不是Java相关,只要是咱们程序员喜欢或需要的其他有趣、有料的好书也可以。

    推荐阅读:

    Java学习路线图

    展开全文
  • 简介怎样学习才能从一名Java初级程序员成长为一名合格的架构师,或者说一名合格的架构师应该有怎样的技术知识体系,这是不仅一个刚刚踏入职场的初级程序员也是工作一两年之后开始迷茫的程序员经常会问到的问题笔者...
  • SQL操作(初级、中级、高级)

    千次阅读 2004-08-17 13:42:00
    从SQL的角度来说,在一个表中不存在前十个记录这种概念。 开始时,当你知道你不能用SQL实现某些你感觉应该能实现的功能,你会受到挫折。你也许会以头撞墙甚至想写恶毒的信件给SQL的设计者们。但后来你会认识到,SQL...
  • 这是一个比较复杂的主题,一般分为初级、高级、以及专门的算法分析三个阶段来学习,因此我们也需要循序渐进。本节主要熟悉数据结构与算法中一般概念,然后熟悉算法效率分析的大O记法,知识结构如下图所示:什么是...
  • BI概念及Cognos模块功能

    千次阅读 2010-05-29 22:42:00
    经历了很长的时间,在这段时间内商业智能的相关技术应用环境越来越成熟,不同的商业智能厂商也都提供了可以解决 全套商业智能解决方案的产品系列,本文对商业智能的相关概念和基本技术作了简单的介绍,并介绍了 ...
  • 什么叫大数据 大数据的概念

    千次阅读 2018-10-07 16:03:17
    的海量、高增长率多样化的信息资产。 大数据技术的战略意义不在于掌握庞大的数据信息,而在于对这些含有意义的数据进行专业化处理。换言之,如果把大数据比作一种产业,那么这种产业实现盈利的关键,在于提高对...
  • 声明:本文转至Big大鸟的博客下,转载的名为《什么叫大数据 大数据的概念》一文,链接...“大数据”是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率多样化的信息资产。大数据...
  • 概念作为风靡全球的经典教材,看到大家对它如此的热情,我无比的感动,可见到各位学习它的方法,作为已经“背”完新概念全四册的我,又深表忧虑。 两年前,我也是新概念的忠实追随者,买齐全套后,恨不得一个月...
  • 软件体系结构基本概念汇总

    千次阅读 2015-07-28 00:36:08
    这门课与UML建模,程序设计方法学一样,都是站...、名词解释(每题2分,共20分) 1、B/S(期中)  答:浏览器/服务器风格,是三层应用结构的一种实现方式。 具体结构:浏览器/Web服务器/数据库服务器。 2、C/S(期中
  • 2016JAVA宝典初级面试题(

    千次阅读 2016-11-29 10:13:24
    1、单线程多线程的优缺点是什么? 单线程就是进程只有一个线程 多线程就是进程有多个线程 同步应用程序的开发比较容易,但由于需要在上一个任务完成后才能开始新的任务, 所以其效率通常比多线程应用程序低。...
  • 初级web程序员进阶指南

    千次阅读 多人点赞 2018-08-16 13:15:27
    初级程序员经常犯的错误集锦 1 命名不规范 2 日志不规范 3 拒绝写接口假数据 4 不写单元测试 5 盲目集成 6 逻辑不清 7 不做方案 8 不关注性能 9 害怕重构 10 做出来就好,不考虑优雅的方案 11 不考虑...
  • 初级篇   本文绝大部分内容引自这篇文章: http://www.devx.com/Java/Article/31983/0/page/1  我们在编写大型程序的时候,需要写成千上万个方法或函数,这些函数的功能可能很强大,但我们在程序中只用到...
  • 区块链相关基础概念

    千次阅读 2020-01-27 15:12:00
    、价值转移的本质 三、什么是比特币 3.1 诞生 3.2 技术解决方案 3.3 比特币的发行模式 四、什么是区块链 定义 五、比特币与区块链的关系 六、区块链的类型与特点 6.1 公有链 6.2 私有链 6.3 联盟链 七、区块链的...
  • 一副图像可定义为一个维函数f(x,y)f(x,y)f(x,y),其中xxxyyy是空间平面的坐标,而幅值fff成为图像在该点处的强度灰度。 当xxx、yyyfff是有限的离散数值时,我们称图像为数字图像。 数字图像处理是指借助于...
  • 深度学习_简介及相关概念

    千次阅读 2017-10-31 11:24:37
    从一个简单例子入手,简述神经网络的工作过程及相关概念
  • 3、参考书籍:《数据结构》(用面向对象方法与C++语言描述) 第版 殷人昆版 4、散列表的基本概念及其运算,点击前往 5、hash算法原理详解,点击前往 6、哈希表(散列表)原理详解,点击前往 7、散列表,点击前往 8、...
  • 企业的每个岗位都有其标准的晋升机制等级要求,只不过大企业把它标准化书面化,而一些小企业则没有这样的要求。但是不可否认的是,每个职责岗位都有其晋升通道,岗位不同,其要求的能力素质也不太一样。 就比如...
  • 深度学习基本概念

    万次阅读 2016-04-13 13:59:36
    申明:本文非笔者原创,原文转载自:... ...4.2、初级(浅层)特征表示 ... 既然像素的特征表示方法没有作用,那怎样的表示才有用呢?... 1995 年前后,Bruno Olshausen David Field 两位
  • Docker初级——介绍、安装使用

    万次阅读 2016-06-30 16:17:07
    项目需要使用Docker,所以自学了几天,仅提供给新手…写该博客一是希望能够帮助像我这样刚学习Docker的新人,是加深自己的印象,如果忘了也可以再看看,有些片段是从其他博客、文档书籍学习来的,但都是自己理解...
  • 一、新概念选择英音还是美音?  答:在书店购买的《新概念》配套磁带就是英音版,由外研社出版。一般我们说的经典语音就是这个版本。但是,对于第一册来说,偶数课,这个版本的录音是没有的。只有美语版...
  • 大数据的概念

    万次阅读 2017-06-03 12:33:51
    的海量、高增长率多样化的信息资产。 大数据技术的战略意义不在于掌握庞大的数据信息,而在于对这些含有意义的数据进行专业化处理。换言之,如果把大数据比作一种产业,那么这种产业实现盈利的关键,在于...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,920
精华内容 4,768
关键字:

初级概念和二级概念的例子