基础概念

概念引入

在实际开发中,并发是很重要的需求,由此而带来的语言层面的切入点就是线程了,引入多线程开发之后,自然要考虑好同步、互斥、安全等内容。
因为这些需求就出现了以下三种来实现线程安全的手段:

  • 互斥同步
    简单点理解就是通过加锁来实现对临界资源的访问限制。加锁方式有Synchorized 和Lock 。
  • 非阻塞同步
    前面提到的互斥同步属于一种悲观锁机制,非阻塞同步属于乐观锁机制。典型的实现方式就是CAS 操作。
  • 无同步方案
    要保证线程安全,并不是一定就需要同步,两者没有因果关系,同步只是保证共享数据征用时正确性的手段,如果一个方法本来就不涉及共享数据,那它就不需要任何同步措施去保证正确性。ThreadLocal 的概念就是从这里引申出来的。
Read more »

简介

当一个类的对象需要被序列化时,但是某些属性不需要被序列化,这时不需要序列化的属性可以使用关键字transient 修饰。
只要被关键字transient 修饰了,序列化时这个属性就不会被序列化了。同时静态修饰也不会被序列化,因为序列化是把对象数据进行持久化存储,而静态的属于类加载时的数据,不会被序列化。

Read more »

简介

Dubbo是阿里巴巴在2011年开源的的分布式服务框架,是SOA服务化治理方案的核心框架。
Dubbo的整体架构如下:

Dubbo主要提供三个方面的功能:

  • 远程接口调用。
  • 负载均衡和容错。
  • 自动服务注册与发现。

首先准备环境,需要安装Zookeeper。详细的Zookeeper信息可以看我的另一篇博客

Read more »

简介

ZooKeeper 是一种用于分布式应用程序的分布式开源协调服务。
Zookeeper 公开了一组简单的原语,分布式应用程序可以构建这些原语,以实现更高级别的服务,以实现同步,配置维护以及组和命名。
Zookeeper 被设计为易于编程,并使用在熟悉的文件系统目录树结构之后设计的数据模型。
它在Java 中运行,并且具有Java 和C 的绑定。
众所周知,协调服务很难做到。他们特别容易出现比赛条件和死锁等错误。
ZooKeeper 背后的动机是减轻分布式应用程序从头开始实施协调服务的责任

Read more »

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import graphql.ExecutionResult;
import graphql.GraphQL;
import graphql.schema.GraphQLSchema;
import graphql.schema.StaticDataFetcher;
import graphql.schema.idl.RuntimeWiring;
import graphql.schema.idl.SchemaGenerator;
import graphql.schema.idl.SchemaParser;
import graphql.schema.idl.TypeDefinitionRegistry;

import static graphql.schema.idl.RuntimeWiring.newRuntimeWiring;

public class HelloWorld {

public static void main(String[] args) {
String schema = "type Query{hello: String} schema{query: Query}";

SchemaParser schemaParser = new SchemaParser();
TypeDefinitionRegistry typeDefinitionRegistry = schemaParser.parse(schema);

RuntimeWiring runtimeWiring = newRuntimeWiring()
.type("Query", builder -> builder.dataFetcher("hello", new StaticDataFetcher("world")))
.build();

SchemaGenerator schemaGenerator = new SchemaGenerator();
GraphQLSchema graphQLSchema = schemaGenerator.makeExecutableSchema(typeDefinitionRegistry, runtimeWiring);

GraphQL build = GraphQL.newGraphQL(graphQLSchema).build();
ExecutionResult executionResult = build.execute("{hello}");

System.out.println(executionResult.getData().toString());
// Prints: {hello=world}
}
}
Read more »

var

JavaScript没有块级作用域

在JS函数中用var声明的变量,其作用域是函数体的全部。

1
2
3
4
5
6
<script type="text/javascript">
for (var i = 0; i < 10; i++) {
var x = 8;
}
console.log(x);
</script>

这里的”x”已经跳出了”for”的作用域,却还可以被访问到。

Read more »

闭包问题

今天要说的是JavaScript的闭包问题,先来看代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<script type="text/javascript">
for (var i = 0; i < json["length"]; i++) {
x += "<td>" + json[i]["contents"] + "</td>";
var row = document.createElement('tr');
row.innerHTML = x;
var op = document.createElement('button');
op.innerText = "购买";
op.setAttribute('style', 'height: 35px; width: 70px; padding-right: 10px; margin: 0 auto;');
op.addEventListener('click', function () { buyLoan(json[i]); }, false);
row.appendChild(op);
tbody.appendChild(row);
x = "";
}

</script>
Read more »

获取ECharts

  1. 官网下载
    在这里我比较推荐去ECharts官网下载,在官网里可以根据你的项目需求而组合你想要的组件。
  2. 从Github 上下载最新的release 版本
    Github地址
  3. npm安装
    1
    npm install echarts --save
  4. cdn引入
    你可以在cdnjs、npmcdn、bootcdn 上找到ECharts 的最新版本。
Read more »

异常

话不多说,先看异常:

1
1 HTTP Status 500 - Could not write content: No serializer found for class org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: java.util.ArrayList[0]->com.agen.entity.User["positionchanges"]->org.hibernate.collection.internal.PersistentSet[0]->com.agen.entity.Positionchange["position"]->com.agen.entity.Position_$$_jvst714_7["handler"]); nested exception is com.fasterxml.jackson.databind.JsonMappingException: No serializer found for class org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: java.util.ArrayList[0]->com.agen.entity.User["positionchanges"]->org.hibernate.collection.internal.PersistentSet[0]->com.agen.entity.Positionchange["position"]->com.agen.entity.Position_$$_jvst714_7["handler"])

网上找到的解决办法说是因为,hibernate会给每一个被管理的对象加上hibernateLayInitializer属性,同时structs-jsonplugin或者其他的jsonplugin都是。
因为jsonplugin用的是java的”内审机制”,hibernate会给被管理的pojo加入一个hibernateLayInitializer属性,jsonplugin通过java的反射机制将pojo解析为json时,
同时hibernateLazyInitializer属性也进行反射操作,但是hibernateLazyIniyializer无法由反射得到,所以就抛出了异常。

Read more »

A + B问题

这是我在LintCode上看见的一道题目,我觉得很有意思,就决定写了博客记录一下。

题目:
给出两个整数 a 和 b , 求他们的和。

要求:

  1. 不允许使用 + 。
  2. 使用运算符。
  3. a和b都是32位的整数。
Read more »