开源中国

我们不支持 IE 10 及以下版本浏览器

It appears you’re using an unsupported browser

为了获得更好的浏览体验,我们强烈建议您使用较新版本的 Chrome、 Firefox、 Safari 等,或者升级到最新版本的IE浏览器。 如果您使用的是 IE 11 或以上版本,请关闭“兼容性视图”。
博客专区 - 开源中国社区

精彩阅读

  • 最新推荐

  • 今日热门

  • 本周热门

  • 每日一博

  • 最新文章

一文带你搞定Integer

1.1 前言 Integer是int对应的包装类,它包含一个int类型的字段存储数据,并提供了多个基本操作,能在 int 类型和 String 类型之间互相转换。在Java5中,引入了自动装箱和自动拆箱功能,Java可根据上下文,自动进行...
筱虾米 发布于 2天前 阅读 121 评论 1

使用Guava的RateLimiter做限流

场景: 1. 在日常生活中,我们肯定收到过不少不少这样的短信,“京东最新优惠卷…”,“天猫送您…”。这种类型的短信是属于推广性质的短信。这种短信一般群发量会到千万级别。然而,要完成这些短信发送,我们是需...
wind2012 发布于 2天前 阅读 101

Go-简洁的并发

多核处理器越来越普及。有没有一种简单的办法,能够让我们写的软件释放多核的威力?是有的。随着Golang, Erlang, Scala等为并发设计的程序语言的兴起,新的并发模式逐渐清晰。正如过程式编程和面向对象一样,一...
万建宁 发布于 2天前 阅读 168 点赞 2

感知哈希算法

# 一、感知哈希算法 ## 1、基于低频的均值哈希 一张图片就是一个二维信号,它包含了不同频率的成分。如下图所示,亮度变化小的区域是低频成分,它描述大范围的信息。而亮度变化剧烈的区域(比如物体的边缘)...
guorongjin 发布于 2天前 阅读 83

Spring AOP 源码分析——创建代理对象

1.简介 与筛选合适的通知器相比,创建代理对象的过程则要简单不少,本文所分析的源码不过100行,相对比较简单。在接下里的章节中,我将会首先向大家介绍一些背景知识,然后再去分析源码。那下面,...
代码屠夫18 发布于 2天前 阅读 169

使用DelayQueue 和 FutureTask 实现java中的缓存

使用DelayQueue、ConcurrentHashMap、FutureTask实现的缓存工具类。 DelayQueue 简介 DelayQueue是一个支持延时获取元素的无界阻塞队列。DelayQueue内部队列使用PriorityQueue来实现。队...
轨迹_ 发布于 2天前 阅读 67

Netty TCP粘包/拆包问题解决

# 什么是TCP的粘包/拆包问题 TCP是“流”协议,所谓流就是没有界限的一串数据。TCP底层并不了解上册业务数据的具体含义,它会根据TCP缓冲区的实际情况进行包的花费,所以在业务上认为,一个完成的包可能会被TCP...
kukudeku 发布于 3天前 阅读 7

这届俄罗斯世界杯的冷门那么多怎么办?

最纯粹的世界杯,最神奇的大冷门。 德国0比1被墨西哥摩擦了。 日本历史性的赢了哥伦比亚。 C罗也挑平了西班牙。 梅西被冰岛狮吼吼愣神了。 就连11次进世界杯4强的巴西也被瑞士逼平了。 天台已经挤满了输红眼的人们。空气中充满了悲伤的气氛。这时候人群中突然传来一声嘶哑声:“快看,楼下又来了一大股民朋友!“ 众人揉揉眼,对的。那些是6月19日从股市中劳作归来的人们。大家目不斜视的直接上了天台,乌央乌央变的异常拥挤,颇有西二旗,高米店这类地铁绞肉机味道。 也许是惺惺相惜,此刻的球迷和股民互诉衷肠,互相安慰。一丝温暖阳光渐渐从众人眼里浮现。那是对面大厦的全屏广告版。硕大的标语像是符文一样催动着大家内心那最柔软的部分!没错!钱没了可以再赚。赚钱的动力就来源于花钱。人们凑了过来看着标牌上的字迹。那上面都写的什么呢? 如果看不清请走近点。点击我
开源中国众包平台 发布于 3天前 阅读 437

自己动手写一个单链表

>文章有不当之处,欢迎指正,如果喜欢微信阅读,你也可以关注我的微信公众号:`好好学java`,获取优质学习资源。 ### 一、概述 单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始。 链式存储结构的线性表将采用一组任意的存储单元存放线性表中的数据元素。由于不需要按顺序存储,链表在插入、删除数据元素时比顺序存储要快,但是在查找一个节点时则要比顺序存储要慢 使用链式存储可以克服顺序线性表需要预先知道数据大小的缺点,链表结构可以充分利用内存空间,实现灵活的内存动态管理。但是链式存储失去了数组随机存取的特点,同时增加了节点的指针域,空间开销较大。 ### 二、图解 下图就是最简单最一般的单向链表: ![这里写图片描述](https://user-gold-cdn.xitu.io/2018/6/20/1641a579e288345c?w=668&h=87&f=png&s=8183) ##### 新增节点: 将值为element的新节点插入到第index的位置上。 首先要先找到索引为index-1的节点,然后生成一个数据为element的新节点newNode,并令index-1处节点的next指向新节点,新节点的next指向原来index处的节点。 ![这里写图片描述](https://user-gold-cdn.xitu.io/2018/6/20/164...
公众号_好好学java 发布于 3天前 阅读 468 点赞 1

一文带你看穿String

1.1 前言         String对象是不可变的。String类中每一个看起来会修改String值的方法,例如拼接、裁剪字符串,实际上都会创建一个全新的String对象,用来包含修改后的字符串内容。因此字符串的相关操作往往对性能有明显的影响。 1.2 定义 public final class String implements java.io.Serializable, Comparable<String>, CharSequence         从代码可以看出String是final类型的,表示该类不能被继承,并且实现了Serializable、Comparable、CharSequence三个接口。 Serializable接口,表明String类是可序列化的。 Comparable接口,提供了一个compareTo(T o) 方法。 CharSequence接口,提供了length(),charAt(int index),subSequence(int start,int end),toString()方法。 1.3 属性 //final类型的字符数组,用于存储字符串内容 private final char value[]; //存放字符串的哈希值 private int hash; // Default to 0 //序列化id private static final long serialVersionUID = -6849794470754667710L; 1.4 构造函数 //不含参数的构造函数 public String() { this.value = "".value; } //使用字符串类型的参数来初始化 public Stri...
筱虾米 发布于 1周前 阅读 720 评论 1 点赞 1

Spring Cloud Config采用数据库存储配置内容【Edgware+】

在之前的[《Spring Cloud构建微服务架构:分布式配置中心》](http://blog.didispace.com/spring-cloud-starter-dalston-3/)一文中,我们介绍的Spring Cloud Server配置中心采用了Git的方式进行配置信息存储。这一设计巧妙的利用Git自身机制以及其他具有丰富功能的Git服务端产品,让Spring Cloud Server在配置存储和管理的上避开了很多与管理相关的复杂实现,使其具备了配置中心存储配置和读取配置的基本能力;而更上层的管理机制,由于不具备普遍适用性,所以Spring Cloud Server并没有自己去实现这部分内容,而是通过Git服务端产品来提供一部分实现,如果还需要更复杂的功能也能自己实现与定义。即便如此,对于Spring Cloud Server默认使用Git来存储配置的方案一直以来还是饱受争议。所以,本文将介绍一下Spring Cloud Config从Edgware版本开始新增的一种配置方式:采用数据库存储配置信息。 ## 构建配置中心服务端 第一步:创建一个基础的Spring Boot项目,在pom.xml中引入几个主要依赖: - `spring-cloud-config-server`:配置中心的基础依赖 - `spring-boot-starter-jdbc`:由于需要访问数据库,所以需要加载jdbc的依赖 - `mysql-connector-java`:MySQL数据库的连接包...
程序猿DD 发布于 1周前 阅读 408 评论 1

用北哥三个火枪手(yii2+houjs+yii2-wx)实现微信礼物打赏功能 --- 上部

> 有段时间没有写实战类的文章了,今天分享一篇,使用yii2+houjs+yii2-wx实现微信送礼物功能。 先来个效果图 ![](https://user-gold-cdn.xitu.io/2018/6/15/164026fa325a1f93?w=1346&h=566&f=jpeg&s=97131) 简单点说就是点击**“送礼物”**按钮后出现一个弹出框,里面有很多礼物,点击某个礼物后弹出框刷新并出现一个二维码,微信扫码支付。 当然这个钱会进入到会员的个人账号内,然后提现。 **为何要做这样一个功能那?** 说心里话我真心没想过通过这个得到多少,更多算一种激励吧,如果你在我们学习社群分享了有价值的文章,你非常有可能受到我的礼物。 好了,还是说功能吧,功能有几个 - 建立数据表结构(礼物以及送礼物日志) - 使用houjs完成前台弹出框 - 使用yii2-wx实现支付二维码 - 为用户增加账户功能 - 使用yii2-wx的企业付款到零钱和yii2的控制台模式现实为用户打款功能(大于等于2元就打款)。 库网址列表 1. **houjs** https://github.com/abei2017/yii2-wx 2. **yii2-wx** https://github.com/abei2017/houjs 我勒个去,干货满满呀。开始。 ## 数据表结构 既然是送礼品,那自然包含礼品表,还有送礼物的日志表,我规划如下。 **礼物表gift** ![](https://us...
阿北2017 发布于 1周前 阅读 303

xmake新增对WDK驱动编译环境支持

[xmake](https://github.com/tboox/xmake) v2.2.1新版本现已支持WDK驱动编译环境,我们可以直接在系统原生cmd终端下,执行xmake进行驱动编译,甚至配合vscode, sublime text, IDEA等编辑器+xmake插件去开发WDK驱动。 下面是xmake支持的一些编辑器插件,用户可以挑选自己喜欢的编辑器配合xmake来使用: * [xmake-idea](https://github.com/tboox/xmake-idea) * [xmake-vscode](https://github.com/tboox/xmake-vscode) * [xmake-sublime](https://github.com/tboox/xmake-sublime) ## WDK环境介绍 首先,我们先简单介绍下WDK10的编译环境的安装方式,我们可以看下微软的官方文档:[Download the Windows Driver Kit (WDK)](https://docs.microsoft.com/en-us/windows-hardware/drivers/download-the-wdk) 里面介绍了两种环境: 1. 下载WDK开发包,直接安装到系统并集成到VS的开发环境中 2. 下载EWDK iso镜像(内含完整WDK开发环境),直接挂载后,运行LaunchBuildEnv进入cmd环境 xmake对于这两种环境都是完全支持的,如果用户直接下载安装WDK环境到本地系统,那么不需要任何配置,只需要执行: ```bash $ xmake ``` xmake会自动检测到WDK的安装环境,然后编译相关驱动项目,...
ruki 发布于 1周前 阅读 210

如何快速搭建一个简单的塔防小游戏

C语言是所有编程语言的基础,当我们对C语言有足够深入的理解后,就能轻松入门其他语言,比如现在流行的Python。现在,我将带领大家看一个基于C语言经典算法,使用Python编写的塔防小游戏。 在塔防游戏中,有许多敌人向着同一目标前进。在很多塔防游戏当中,有一条或几条事先预定好的路径。在一些中,比如经典的《Desktop Tower Defense》,你可以将塔放在任何位置,它们充当障碍影响敌人选择的路径。试一试,点击地图来移动墙壁: 我们如何来实现这种效果? 像A*这样的图搜索算法经常被用来寻找两点之间的最短路径。你可以用这个来为每一个敌人找到前往目标的路径。在这种类型的游戏当中,我们有很多不同的图搜索算法来。这是一些经典方法 单源,单目标: 贪心搜索算法 A*算法 – 在游戏当中常用 单源多目标或多源单目标 广度优先算法-无加权边 Dijkstra算法-有加权边 Bellman-Ford算法-支持负权重 多源多目标 Floyd-Warshall算法 Johnson’s算法 像《Desktop Tower Defense》这样的游戏会有很多个敌人(源)和一个共同的目的地。这使得它被归为多源单目标一类。我们可以执行一个算法,一次算出所有敌人的路径,而不是为每个敌人执行一次A*算法。更好的是,我们可以计算出每...
柳猫 发布于 1周前 阅读 496 点赞 1

Python标准库笔记(10) — itertools模块

> itertools 用于更高效地创建迭代器的函数工具。 > Python版本 3.x `itertools` 提供的功能受Clojure,Haskell,APL和SML等函数式编程语言的类似功能的启发。它们的目的是快速有效地使用内存,并且将它们关联在一起以表示更复杂的基于迭代的算法。 基于迭代器的代码比使用列表的代码提供了更好的内存消耗特性。因为直到数据需要使用时才从迭代器中生成,所有数据不需要同时存储在内存中。这种 `“惰性”` 的处理模式可以减少大型数据集的交换和其他副作用,从而提高性能。 除了 `itertools` 中定义的函数之外,本文中的示例还使用了一些内置函数进行迭代。 ## 1.合并和分割 `chain()` 函数将多个迭代器作为参数,并返回一个迭代器,这样它生成所有输入的内容,就像来自于单个迭代器一样。 ```python from itertools import chain for i in chain([1, 2, 3], ['a', 'b', 'c']): print(i, end=' ') ``` 使用 `chain()` 可以轻松地处理多个序列,而不需要生成一个更大的序列。 ```python # OutPut 1 2 3 a b c ``` 如果要组合的迭代不是全部预先显式声明的,或者需要惰性计算的,则可以使用 `chain.from_iterable()` 来替换 `chain()` 。 ```python from itertools import ch...
j_hao104 发布于 1周前 阅读 474 点赞 1

Java OSGL 工具库 - Bean 拷贝的艺术

本篇是 Java OSGL 工具库系列的第六篇, 前面五篇分别是: 1. [图片处理的艺术](https://my.oschina.net/greenlaw110/blog/1786151) 2. [图片处理的艺术之自定义图片处理器](https://my.oschina.net/greenlaw110/blog/1790145) 3. [字符串操作的艺术](https://my.oschina.net/greenlaw110/blog/1790369) 4. [I/O 操作的艺术](https://my.oschina.net/greenlaw110/blog/1790370) 5. [类型转换的艺术](https://my.oschina.net/greenlaw110/blog/1790380) ## 1. API 一览 ```java // shallow copy from `foo` to `bar` $.copy(foo).to(bar); // deep copy from `foo` to `bar $.deepCopy(foo).to(bar); // deep copy using loose name match $.deepCopy(foo).looseMatching().to(bar); // deep copy with filter $.deepCopy(foo).filter("-password,-address.streetNo").to(bar); // deep copy with special name mapping rule $.deepCopy(foo) .map("id").to("no") .map("subject").to("title") .to(bar); // merge data from `foo` to `bar` $.merge(foo).to(bar); // map data from `foo` to `bar` $.map(foo).to(bar); // map data from `foo` to `bar` using strict name m...
罗格林 发布于 1周前 阅读 2213 评论 13 点赞 8

AtomicInteger源码剖析

1.1前言         AtomicInteger是一个支持原子操作的Integer类,它提供了原子自增方法、原子自减方法以及原子赋值方法等。其底层是通过volatile和CAS实现的,其中volatile保证了内存可见性,CAS算法保证了原子性。因此接下来我们先了解下volatile和CAS,然后在研究下AtomicInteger的源码。 1.2volatile变量         volatile是一种稍弱的同步机制,用来确保将变量的更新操作通知到其他线程。当把变量声明为volatile类型后,编译器与运行时都会注意到这个变量是共享的,因此不会将该变量上的操作与其他内存操作一起重排序。volatile变量不会被缓存在寄存器或者对其他处理器不可见的地方,因此在读取volatile类型的变量时总返回最新写入的值。在访问volatile变量时不会执行加锁操作,因此也就不会使执行线程阻塞,因此volatile变量是一种比sychronized关键字更轻量级的同步机制。 1.3CAS         CAS(Compare And Swap)即比较并交换,CAS是乐观锁技术,当多个线程尝试使用CAS同时更新同一个变量时,只有其中一个线程能更新变量的值,而其它线程都失败,失败的线程并不会被挂起,而是被告知这次竞争中失败,并可以再次尝试。它包含三个参数:V内存值,...
筱虾米 发布于 2周前 阅读 51

JPA、Hibernate、Spring data jpa之间的关系,终于明白了

什么么是JPA? 全称Java Persistence API,可以通过注解或者XML描述【对象-关系表】之间的映射关系,并将实体对象持久化到数据库中。 为我们提供了: 1)ORM映射元数据:JPA支持XML和注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中; 如:@Entity、@Table、@Column、@Transient等注解。  2)JPA 的API:用来操作实体对象,执行CRUD操作,框架在后台替我们完成所有的事情,开发者从繁琐的JDBC和SQL代码中解脱出来。 如:entityManager.merge(T t);  3)JPQL查询语言:通过面向对象而非面向数据库的查询语言查询数据,避免程序的SQL语句紧密耦合。 如:from Student s where s.name = ? 但是: JPA仅仅是一种规范,也就是说JPA仅仅定义了一些接口,而接口是需要实现才能工作的。所以底层需要某种实现,而Hibernate就是实现了JPA接口的ORM框架。 也就是说: JPA是一套ORM规范,Hibernate实现了JPA规范!如图: 什么是spring data jpa? spirng data jpa是spring提供的一套简化JPA开发的框架,按照约定好的【方法命名规则】写dao层接口,就可以在不写接口实现的情况下,实现对数据库的访问和操作。同时提供了很多除了CRUD之...
java思维导图 发布于 2周前 阅读 2734 评论 13 点赞 7

前端后台以及游戏中使用google-protobuf详解

### 前端后台以及游戏中使用google-protobuf详解 [TOC] #### 0、什么是protoBuf protoBuf是一种灵活高效的独立于语言平台的结构化数据表示方法,与XML相比,protoBuf更小更快更简单。你可以用定义自己protoBuf的数据结构,用ProtoBuf编译器生成特定语言的源代码,如C++,Java,Python等,目前protoBuf对主流的编程语言都提供了支持,非常方便的进行序列化和反序列化。 特点: - 平台无关、语言无关。 - 二进制、数据自描述。 - 提供了完整详细的操作API。 - 高性能 比xml要快20-100倍 - 尺寸小 比xml要小3-10倍 高可扩展性 - 数据自描述、前后兼容 #### 1、下载protobuf的编译器 [目前最新版本为Protocol Buffers v3.5.1](https://github.com/google/protobuf/releases) #### 2、配置环境变量 解压 `protoc-3.5.1-osx-x86_64.zip` Mac 配置环境变量 `vi ~/.bash_profile` 使其配置生效`source ~/.bash_profile` ```json #protobuf export PROTOBUF_HOME=/Users/Javen/Documents/dev/java/protobuf/protoc-3.5.1-osx-x86_64 export PATH=$PATH:$PROTOBUF_HOME/bin ``` Window 将bin添加到path 即可 例如:`D:\protobuf\protoc-3.5.1-win32\bin` `本文在Mac环境下编写` **Mac**...
Javen 发布于 2周前 阅读 1592 评论 5 点赞 2

Redis实现分布式锁的几种方案

1.1方案一         利用setnx和expire命令实现加锁。当一个线程执行setnx返回1,说明key不存在,该线程获得锁;当一个线程执行setnx返回0,说明key已经存在,则获取锁失败。expire就是给锁加一个过期时间。伪代码如下: if(setnx(key,value)==1){ expire(key,expireTime) try{ //业务处理 }finally{ del(key) } }         该方案有一个致命问题,由于setnx和expire是两条Redis命令,不具备原子性,如果一个线程在执行完setnx()之后突然崩溃,导致锁没有设置过期时间,那么将会发生死锁。 1.2方案二         利用setnx命令加锁,其中key是锁,value是锁的过期时间,1.通过setnx()方法尝试加锁,如果当前锁不存在,返回加锁成功。2. 如果锁已经存在则获取锁的过期时间,和当前时间比较,如果锁已经过期,则设置新的过期时间,返回加锁成功。伪代码如下: long expires = System.currentTimeMillis() + expireTime; String expiresStr = String.valueOf(expires); // 如果当前锁不存在,返回加锁成功 if (setnx(key, expiresStr) == 1) { return true; } // 如果锁存...
筱虾米 发布于 2周前 阅读 117

IntelliJ IDEA 2018.1新特性

工欲善其事必先利其器,如果有一款IDE可以让你更高效地专注于开发以及源码阅读,为什么不试一试? 本文转载自:netty技术内幕 3月27日,jetbrains正式发布期待已久的IntelliJ IDEA 2018.1,再次让人眼前一亮:什么...
Romane 发布于 16小时前

华为云」云中优选惠,全场低至2折,6.19-6.30开抢,签到抽P20

华为云年中钜惠,注册抽免费高配(2核4G)云服务器,单人成团2折起抢购热销云产品;云服务器、数据库、安全防护、大数据等150+云产品,更有精彩好礼送不停!
华为云

PHP语言系统ZBLOG或许无法重现月光博客的闪耀历史[图]

最近在写博客,希望通过自己努力打造一个优秀的教育类主题博客,名动江湖,但是问题来了,现在写博客还有前途吗?面对强大的自媒体站点围剿,还有信心和可能型吗? 至于程序部分,我选择了PHP语言编写的ZBLOG系统...
原创小博客 发布于 15小时前

C++难点解析之const修饰符

C++难点解析之const修饰符 c++ 相比于其他编程语言,可能是最为难掌握,概念最为复杂的。结合自己平时的C++使用经验,这里将会列举出一些常见的难点并给出相应的解释。 const修饰符 const在c++中常用语意是固定,...
jackie8tao 发布于 17小时前

组合数学 1-2000 中,能被6或10整除的数的个数

1--2000 中,能被6或10整除的数的个数 利用集合的性质 能被6整除的个数 2000/6 = 333 能被10整除的个数 2000/10 = 200 能被6和10整除的个数 2000/30 = 66 能被6或10整除的个数 333+200-66 = 467 c1 = 0 c2 = ...
阿豪boy 发布于 3小时前

博客迁移到 https://www.jianshu.com/u/aa501451a235

博客迁移到 https://www.jianshu.com/u/aa501451a235 本博客不再更新
为为02 发布于 14小时前

策略模式

1.策略模式 策略模式是同一个行为的不同处理办法。 策略模式和简单工厂模式的区别:1.策略模式主要是方法的执行方式,工厂模式要获取的对象。两者的侧重点不同。 2.工厂模式相当于黑盒...
Cobbage 发布于 2小时前

Java8——三种多线程方式

JDK 8在线程方面的改进比较大,支持了函数式编程
木云凌 发布于 2个月前 阅读 80

作为一名java程序员你的薪资为什么上不去?

不管是开发、测试、运维,每个技术人员心里多多少少都有一个成为技术大牛的梦,毕竟“梦想总是要有的,万一实现了呢”!正是对技术梦的追求,促使我们不断地努力和提升自己。 很多人在问我,程序员如何拿高薪,如何做到年薪40W+,其实总结出来还是一句话,你的技术决定你的能力已经薪资。 那么什么样的技术人才才能拿到一份Java行业里面的高薪呢? Java程序员的职业发展有几个选择:专注于技术,成为技术专家;转型到技术型销售、技术支持等;随着技术成长,从技术性管理到高级管理。 这归根结底,都是以Java技术为基础。在扎实的技术基础上(高级软件工程师),如果有着比较强的抽象设计能力,又打算专注于技术开发,架构师是个好的选择;如果性格更适合做管理,情商能力突出,技术型管理应该是下一步的方向。这种发展规划属于‘瘸腿走路’的类型,各有侧重主攻发展的职业方向,也是目前一般程序员普遍采用的发展路线规划。 已经工作两年以上的程序员可以有几种基本的职业规划:技术专家、软件架构师、实施顾问或销售。其中程序员最主要的发展方向是资深技术专家,无论是 Java、.NET还是数据库领域,都要首先成为专家,然后才可能继续发展为架构师。尽管架构师的职位可以工...
java高级架构牛人 发布于 2个月前 阅读 77 评论 1 点赞 2

Docker Compose+nginx实现负载均衡

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
郑龙飞 发布于 3个月前 阅读 228

深入Java多线程——Java内存模型深入(2)

5. final域的内存语义 5.1 final域的重排序规则     1.对于final域,编译器和处理器要遵守两个重排序规则: (1)在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。 (2)初次读一个包含final域的对象的引用,与随后初次读这个final域,这两个操作之间不能重排序。     以下列代码为例进行解释,假设线程A执行执行writer方法,线程B执行reader方法。 public class FinalExample { int i; // 普通变量 final int j; // final变量 static FinalExample obj; public FinalExample() { // 构造函数 i = 1; // 写普通域 j = 2; // 写final域 } public static void writer() { // 写线程A执行 obj = new FinalExample(); } public static void reader() { // 读线程B执行 FinalExample object = obj; // 读对象引用 int a = object.i; // 读普通域 int b = object.j; // 读final域 } } 5.2 写final域的重排序规则     1. 写final域的重排序规则禁止把final域的写重排序到构造函数之外。这个规则的实现包含下面2个方面: (1)JMM禁止编译器把final域的写重排序到构...
江左煤郎 发布于 5天前 阅读 6

vscode安装golang扩展插件

安装完vscode,打开.go文件时,vscode会推荐安装go扩展插件,但是vscode中有些go的插件总是提示安装fail。如golint插件,解决办法如下: cd $GOPATH/src/golang.org/x/ git clone https://github.com/golang/tools.git cd $GOPATH/golang.org/x/ git clone https://github.com/golang/lint.git cd $GOPATH/src go install github.com/lint/golint 其它插件类似: cd $GOPATH/src go get -u -v golang.org/x/tools/cmd/godoc go get -u -v github.com/nsf/gocode go get -u -v github.com/golang/lint/golint go get -u -v github.com/lukehoban/go-outline go get -u -v github.com/rogpeppe/godef go get -u -v sourcegraph.com/sqs/goreturns go get -u -v golang.org/x/tools/cmd/gorename go get -u -v golang.org/x/tools/cmd/guru go get -u -v github.com/tpng/gopkgs go get -u -v github.com/newhook/go-symbols go get -u -v github.com/derekparker/delve/cmd/dlv go get -u -v github.com/josharian/impl go get -u -v github.com/cweill/gotests/gotests go get -u -v github.com/lukehoban/go-find-references go get -u -v github.com/fatih/gomodifytags...
wangxuwei 发布于 3周前 阅读 16

Python操作Mongodb

### 一 导入 pymongo from pymongo import MongoClient ### 二 连接服务器 端口号 27017 连接MongoDB 连接MongoDB我们需要使用PyMongo库里面的MongoClient,一般来说传入MongoDB的IP及端口即可,第一个参数为地址host,第二个参数为端口port,端口如果不传默认是27017。 conn = MongoClient("localhost") MongoClient(host='127.0.0.1',port=27017) ### 三 连接数据库 db = conn.数据库名称 连接集合 collection = db[collection_name] or collection = db.collection_name 查看全部聚集名称 db.collection_names() ### 四 插入数据 ##### (1) 插入一条数据 db.user.insert({"name":"夏利刚","age":18,"hobby":"学习"}) ##### (2) 插入多条数据 db.user.insert([{"name":"夏利刚","age":18,"hobby":"学习"},{"name":"xxxoo","age":48,"hobby":"学习"}] ##### (3) 在3.x以上 建议 使用 insert_one 插入一条数据 insert_many() 插入多条数据 ##### (4) 返回 id 使用insert_one() data.inserted_id data.inserted_ids ![](https://upload-images.jianshu.io/upload_images/11678829-b997b9b230547c14.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) #### 五 查询数...
p柯西 发布于 2周前 阅读 8

思路分析 如何通过反射 给 bean entity 对象 的List 集合属性赋值?

其实 这块 大家 去 看 springmvc 源码 肯定可以找到实现办法。 因为 spirngmvc 的方法 是可以 为 对象 参数里面的 list 属性赋值的。 我也没有看 具体的 mvc 源码实现,我这里只是 写一个 简单的思路。 通过我的这...
之渊 发布于 1小时前

Java的23中设计模式--工厂模式

# 一、设计模式的分类 总体来说设计模式分为**三大类**: **创建型模式**,共五种:**工厂方法模式、抽象工厂模式**、单例模式、建造者模式、原型模式。 **结构型模式**,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 **行为型模式**,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。 其实还有两类:并发型模式和线程池模式。 # 1、工厂方法模式(Factory Method) 工厂方法模式分为三种:普通工厂模式、多工厂模式、静态工厂模式 ### 1.1、普通工厂模式 就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建。首先看下关系图: ![image](http://dl.iteye.com/upload/attachment/0083/1180/421a1a3f-6777-3bca-85d7-00fc60c1ae8b.png) 举例如下:(我们举一个发送邮件和短信的例子) 首先,创建二者的共同接口: ``` public interface Sender { public void Send(); } ``` 其次,创建实现类: ``` public class MailSender implements Sender { @Override public void Send() { System.out.println("this is mailsender!...
蓝色雨全 发布于 2个月前 阅读 38

VSCode Markdown数学公式插件

Markdown+Math What is it ... mdmath allows to use Visual Studio Code as a markdown editor capable of typesetting and rendering TeX math. In fact it now reuses the built in markdown viewer. KaTeX works inside as a fast math renderer. You can install the extension directly from Visual Studio Code Marketplace. Features Simplify the process of authoring and live previewing markdown documents containing math formulas. This extension is a comfortable tool for scientists, engineers and students with markdown as their first choice document format. Inline math Display math Formula numbering Inline math with tables Export resulting HTML code for web usage What is new in mdmath 2.0 ... Integrated in native markdown viewer. So after installing the extension, TeX math is properly displayed in the markdown preview window. Based on markdown-it plugin markdown-it-texmath. Using vscode's Markdown Extension API. Editor view and Preview are synchronized while scrolling. Heavily reduced code size. Work...
临江仙卜算子 发布于 1个月前 阅读 78

【CLI】使用 Curl 下载文件实时进度条显示

最近在捣鼓命令行下的编程,下载文件总是一个难熬的过程,如果有进度条就好很多了!!! **** 先上一个进度条的扩展包,还是不错的[https://github.com/dariuszp/cli-progress-bar](https://github.com/dariuszp/cli-progress-bar) ![https://github.com/dariuszp/cli-progress-bar/raw/master/examples/img/terminal.gif](https://github.com/dariuszp/cli-progress-bar/raw/master/examples/img/terminal.gif) 还是挺好看的! **** `curl`做为 PHP 一个很常用的下载方式,这里简单的使用方式; ```php // 初始化一个 curl $ch = curl_init(); // 设置请求的 url curl_setopt($ch, CURLOPT_URL, $url); // curl_setopt($ch, CURLOPT_HEADER, 0); // 不直接输出,而是通过 curl_exec 返回 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); if (false === ($stream = curl_exec($ch))) { throw new \Exception(curl_errno($ch)); } curl_close($ch); return $stream; ``` 上面是一个很简单的例子,如果一个文件很大,那么用户就需要等待很长的时间,这时候我们就应该加上进度条的效果: ```php class Request { protected $bar; // 是否下载完成 protected $downloaded = fals...
等月人 发布于 3个月前 阅读 10

Python获取全网电影,深夜有小电影看难道不是你学习的初衷吗?

![](https://upload-images.jianshu.io/upload_images/11678829-889b1e2c6a8502b2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 你以为这是黑客?NO,这只是简单的Python爬虫。如今各种各样的影视Vip收费出现在我们的视野中,对于我们来说也许是一部期待已久的电影电视,可是对于网站,App开发人员来说只是一组数据,为了一组数据去付费、等广告时间,我觉得还是有所不值的!对于普通人来说也没多少钱,就充值了,然而对于我们Python开发人员是不可能的,爬虫如此简单,自己本身就是Vip。 ![](http://upload-images.jianshu.io/upload_images/11678829-d6d8975a35571c70?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 抓取一个影视网站,把所有的资源为己所用,使用python写一个多线程的爬虫。用到的第三方模块: 1 . requests2\. BeautifulSoup3\. lxml首先第一步,获得整站所有的视频链接 ![](http://upload-images.jianshu.io/upload_images/11678829-7844a99b69b579f4?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 第二步,进入选择的电影的页面去获得视频的链接 ![](http://upload-images.jianshu.io/upload_images/11678829-ecfb0cc8a...
p柯西 发布于 3周前 阅读 38

在Jupyter Notebook中增加Python内核

本人在Python 3.6的环境下,安装了Jupyter pip3 install jupyter 进入到Jupyter Notebook后,点击Kernel菜单的Change kernel子菜单,只看到只有一个Python 3。如果这时想要增加Python 2的内核(Python 2.7),可通过以下方式操作 安装 ipykernel pip install ipykernel 在安装时,出现了报错 Complete output from command python setup.py egg_info: IPython 6.0+ does not support Python 2.6, 2.7, 3.0, 3.1, or 3.2. When using Python 2.7, please install IPython 5.x LTS Long Term Support version. Beginning with IPython 6.0, Python 3.3 and above is required. 也就是说最新版的 IPython 不支持 Python 2.7,这时可先单独安装ipython,并指定旧的版本号进行安装 pip install ipython==5.3.0 如果版本不存在的,系统会进行提醒存在的版本号 安装好ipython后,再重新安装ipykernel,这时又报错,如下 ImportError: Tornado requires an up-to-date SSL module. 也就是说在安装Tornado时出错。这时,同样的,再单独安装Tornado,这时也出现了版本问题,与上面类似,指定旧的版本号 pip install tornado==4.5.3 然后再重新安装ipykernel,就可以...
雪饼 发布于 2周前 阅读 21

MySQL 数据库的高可用性分析

MySQL数据库是目前开源应用最大的关系型数据库,有海量的应用将数据存储在MySQL数据库中。存储数据的安全性和可靠性是生产数据库的关注重点。本文分析了目前采用较多的保障MySQL可用性方案。 MySQL Replication ...
OSC_cnhwTY 发布于 20小时前

Python分布式进程中你会遇到的坑

![DBnXd.png](https://storage6.cuntuku.com/2018/04/01/DBnXd.png) ## 写在前面 ### 小惊大怪 你是不是在用Python3或者在windows系统上编程?最重要的是你对进程和线程不是很清楚?那么恭喜你,在python分布式进程中,会有坑等着你去挖。。。(hahahaha,此处允许我吓唬一下你)开玩笑的啦,不过,如果你知道序列中不支持匿名函数,那这个坑就和你say byebye了。好了话不多数,直接进入正题。 ### 分布式进程 正如大家所知道的Process比Thread更稳定,而且Process可以分布到多台机器上,而Thread最多只能分布到同一台机器的多个CPU上。Python的multiprocessing模块不但支持多进程,其中managers子模块还支持把多进程分布到多台机器上。一个服务进程可以作为调度者,将任务分布到其他多个进程中,依靠网络通信。由于managers模块封装很好,不必了解网络通信的细节,就可以很容易地编写分布式多进程程序。 ## 代码记录 ### 举个例子 如果我们已经有一个通过Queue通信的多进程程序在同一台机器上运行,现在,由于处理任务的进程任务繁重,希望把发送任务的进程和处理任务的进程分布到两台机器上,这应该怎么用分布式进程来实现呢?你已经知道了原有的Queue可以继续使用,而且通...
拾光MT 发布于 3个月前 阅读 97

JPA、Hibernate、Spring data jpa之间的关系,终于明白了

什么么是JPA? 全称Java Persistence API,可以通过注解或者XML描述【对象-关系表】之间的映射关系,并将实体对象持久化到数据库中。 为我们提供了: 1)ORM映射元数据:JPA支持XML和注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中; 如:@Entity、@Table、@Column、@Transient等注解。  2)JPA 的API:用来操作实体对象,执行CRUD操作,框架在后台替我们完成所有的事情,开发者从繁琐的JDBC和SQL代码中解脱出来。 如:entityManager.merge(T t);  3)JPQL查询语言:通过面向对象而非面向数据库的查询语言查询数据,避免程序的SQL语句紧密耦合。 如:from Student s where s.name = ? 但是: JPA仅仅是一种规范,也就是说JPA仅仅定义了一些接口,而接口是需要实现才能工作的。所以底层需要某种实现,而Hibernate就是实现了JPA接口的ORM框架。 也就是说: JPA是一套ORM规范,Hibernate实现了JPA规范!如图: 什么是spring data jpa? spirng data jpa是spring提供的一套简化JPA开发的框架,按照约定好的【方法命名规则】写dao层接口,就可以在不写接口实现的情况下,实现对数据库的访问和操作。同时提供了很多除了CRUD之...
java思维导图 发布于 2周前 阅读 2734 评论 13 点赞 7

京东Java架构师讲解购物车的原理及Java实现

今天来写一下关于购物车的东西, 这里首先抛出四个问题: 1)用户没登陆用户名和密码,添加商品, 关闭浏览器再打开后 不登录用户名和密码 问:购物车商品还在吗?  2)用户登陆了用户名密码,添加商品,关闭浏览器再打开后 不登录用户名和密码 问:购物车商品还在吗?    3)用户登陆了用户名密码,添加商品, 关闭浏览器,然后再打开,登陆用户名和密码  问:购物车商品还在吗? 4)用户登陆了用户名密码,添加商品, 关闭浏览器 外地老家打开浏览器  登陆用户名和密码 问:购物车商品还在吗? 上面四个问题都是以京东为模板, 那么大家猜猜结果是什么呢? 1)在 2)不在了 3)在 4)在 如果你能够猜到答案, 那么说明你真的很棒, 那么关于这四点是怎么实现的呢? (如果有不认可的小伙伴可以用京东实验一下) 下面我们就来讲解下购物车的原理,最后再来说下具体的code实现. 1)用户没有登录, 添加商品, 此时的商品是被添加到了浏览器的Cookie中, 所以当再次访问时(不登录),商品仍然在Cookie中, 所以购物车中的商品还是存在的. 2)用户登录了,添加商品, 此时会将Cookie中和用户选择的商品都添加到购物车中, 然后删除Cookie中的商品. 所以当用户再次访问(不登录),此时Cooki...
Java工程师-Distance 发布于 1个月前 阅读 9715 评论 55 点赞 18

一文带你看穿String

1.1 前言         String对象是不可变的。String类中每一个看起来会修改String值的方法,例如拼接、裁剪字符串,实际上都会创建一个全新的String对象,用来包含修改后的字符串内容。因此字符串的相关操作往往对性能有明显的影响。 1.2 定义 public final class String implements java.io.Serializable, Comparable<String>, CharSequence         从代码可以看出String是final类型的,表示该类不能被继承,并且实现了Serializable、Comparable、CharSequence三个接口。 Serializable接口,表明String类是可序列化的。 Comparable接口,提供了一个compareTo(T o) 方法。 CharSequence接口,提供了length(),charAt(int index),subSequence(int start,int end),toString()方法。 1.3 属性 //final类型的字符数组,用于存储字符串内容 private final char value[]; //存放字符串的哈希值 private int hash; // Default to 0 //序列化id private static final long serialVersionUID = -6849794470754667710L; 1.4 构造函数 //不含参数的构造函数 public String() { this.value = "".value; } //使用字符串类型的参数来初始化 public Stri...
筱虾米 发布于 1周前 阅读 720 评论 1 点赞 1

自己动手写一个单链表

>文章有不当之处,欢迎指正,如果喜欢微信阅读,你也可以关注我的微信公众号:`好好学java`,获取优质学习资源。 ### 一、概述 单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始。 链式存储结构的线性表将采用一组任意的存储单元存放线性表中的数据元素。由于不需要按顺序存储,链表在插入、删除数据元素时比顺序存储要快,但是在查找一个节点时则要比顺序存储要慢 使用链式存储可以克服顺序线性表需要预先知道数据大小的缺点,链表结构可以充分利用内存空间,实现灵活的内存动态管理。但是链式存储失去了数组随机存取的特点,同时增加了节点的指针域,空间开销较大。 ### 二、图解 下图就是最简单最一般的单向链表: ![这里写图片描述](https://user-gold-cdn.xitu.io/2018/6/20/1641a579e288345c?w=668&h=87&f=png&s=8183) ##### 新增节点: 将值为element的新节点插入到第index的位置上。 首先要先找到索引为index-1的节点,然后生成一个数据为element的新节点newNode,并令index-1处节点的next指向新节点,新节点的next指向原来index处的节点。 ![这里写图片描述](https://user-gold-cdn.xitu.io/2018/6/20/164...
公众号_好好学java 发布于 3天前 阅读 468 点赞 1

这届俄罗斯世界杯的冷门那么多怎么办?

最纯粹的世界杯,最神奇的大冷门。 德国0比1被墨西哥摩擦了。 日本历史性的赢了哥伦比亚。 C罗也挑平了西班牙。 梅西被冰岛狮吼吼愣神了。 就连11次进世界杯4强的巴西也被瑞士逼平了。 天台已经挤满了输红眼的人们。空气中充满了悲伤的气氛。这时候人群中突然传来一声嘶哑声:“快看,楼下又来了一大股民朋友!“ 众人揉揉眼,对的。那些是6月19日从股市中劳作归来的人们。大家目不斜视的直接上了天台,乌央乌央变的异常拥挤,颇有西二旗,高米店这类地铁绞肉机味道。 也许是惺惺相惜,此刻的球迷和股民互诉衷肠,互相安慰。一丝温暖阳光渐渐从众人眼里浮现。那是对面大厦的全屏广告版。硕大的标语像是符文一样催动着大家内心那最柔软的部分!没错!钱没了可以再赚。赚钱的动力就来源于花钱。人们凑了过来看着标牌上的字迹。那上面都写的什么呢? 如果看不清请走近点。点击我
开源中国众包平台 发布于 3天前 阅读 437

Java OSGL 工具库 - Bean 拷贝的艺术

本篇是 Java OSGL 工具库系列的第六篇, 前面五篇分别是: 1. [图片处理的艺术](https://my.oschina.net/greenlaw110/blog/1786151) 2. [图片处理的艺术之自定义图片处理器](https://my.oschina.net/greenlaw110/blog/1790145) 3. [字符串操作的艺术](https://my.oschina.net/greenlaw110/blog/1790369) 4. [I/O 操作的艺术](https://my.oschina.net/greenlaw110/blog/1790370) 5. [类型转换的艺术](https://my.oschina.net/greenlaw110/blog/1790380) ## 1. API 一览 ```java // shallow copy from `foo` to `bar` $.copy(foo).to(bar); // deep copy from `foo` to `bar $.deepCopy(foo).to(bar); // deep copy using loose name match $.deepCopy(foo).looseMatching().to(bar); // deep copy with filter $.deepCopy(foo).filter("-password,-address.streetNo").to(bar); // deep copy with special name mapping rule $.deepCopy(foo) .map("id").to("no") .map("subject").to("title") .to(bar); // merge data from `foo` to `bar` $.merge(foo).to(bar); // map data from `foo` to `bar` $.map(foo).to(bar); // map data from `foo` to `bar` using strict name m...
罗格林 发布于 1周前 阅读 2213 评论 13 点赞 8

Spring Cloud Config采用数据库存储配置内容【Edgware+】

在之前的[《Spring Cloud构建微服务架构:分布式配置中心》](http://blog.didispace.com/spring-cloud-starter-dalston-3/)一文中,我们介绍的Spring Cloud Server配置中心采用了Git的方式进行配置信息存储。这一设计巧妙的利用Git自身机制以及其他具有丰富功能的Git服务端产品,让Spring Cloud Server在配置存储和管理的上避开了很多与管理相关的复杂实现,使其具备了配置中心存储配置和读取配置的基本能力;而更上层的管理机制,由于不具备普遍适用性,所以Spring Cloud Server并没有自己去实现这部分内容,而是通过Git服务端产品来提供一部分实现,如果还需要更复杂的功能也能自己实现与定义。即便如此,对于Spring Cloud Server默认使用Git来存储配置的方案一直以来还是饱受争议。所以,本文将介绍一下Spring Cloud Config从Edgware版本开始新增的一种配置方式:采用数据库存储配置信息。 ## 构建配置中心服务端 第一步:创建一个基础的Spring Boot项目,在pom.xml中引入几个主要依赖: - `spring-cloud-config-server`:配置中心的基础依赖 - `spring-boot-starter-jdbc`:由于需要访问数据库,所以需要加载jdbc的依赖 - `mysql-connector-java`:MySQL数据库的连接包...
程序猿DD 发布于 1周前 阅读 408 评论 1

IDEA 启动报错could not find main class com/intellij/idea/main解决办法

IDEA 启动报错could not find main class com/intellij/idea/main解决办法
辉_Dreaming 发布于 2个月前 阅读 2066

用北哥三个火枪手(yii2+houjs+yii2-wx)实现微信礼物打赏功能 --- 上部

> 有段时间没有写实战类的文章了,今天分享一篇,使用yii2+houjs+yii2-wx实现微信送礼物功能。 先来个效果图 ![](https://user-gold-cdn.xitu.io/2018/6/15/164026fa325a1f93?w=1346&h=566&f=jpeg&s=97131) 简单点说就是点击**“送礼物”**按钮后出现一个弹出框,里面有很多礼物,点击某个礼物后弹出框刷新并出现一个二维码,微信扫码支付。 当然这个钱会进入到会员的个人账号内,然后提现。 **为何要做这样一个功能那?** 说心里话我真心没想过通过这个得到多少,更多算一种激励吧,如果你在我们学习社群分享了有价值的文章,你非常有可能受到我的礼物。 好了,还是说功能吧,功能有几个 - 建立数据表结构(礼物以及送礼物日志) - 使用houjs完成前台弹出框 - 使用yii2-wx实现支付二维码 - 为用户增加账户功能 - 使用yii2-wx的企业付款到零钱和yii2的控制台模式现实为用户打款功能(大于等于2元就打款)。 库网址列表 1. **houjs** https://github.com/abei2017/yii2-wx 2. **yii2-wx** https://github.com/abei2017/houjs 我勒个去,干货满满呀。开始。 ## 数据表结构 既然是送礼品,那自然包含礼品表,还有送礼物的日志表,我规划如下。 **礼物表gift** ![](https://us...
阿北2017 发布于 1周前 阅读 303

Python标准库笔记(10) — itertools模块

> itertools 用于更高效地创建迭代器的函数工具。 > Python版本 3.x `itertools` 提供的功能受Clojure,Haskell,APL和SML等函数式编程语言的类似功能的启发。它们的目的是快速有效地使用内存,并且将它们关联在一起以表示更复杂的基于迭代的算法。 基于迭代器的代码比使用列表的代码提供了更好的内存消耗特性。因为直到数据需要使用时才从迭代器中生成,所有数据不需要同时存储在内存中。这种 `“惰性”` 的处理模式可以减少大型数据集的交换和其他副作用,从而提高性能。 除了 `itertools` 中定义的函数之外,本文中的示例还使用了一些内置函数进行迭代。 ## 1.合并和分割 `chain()` 函数将多个迭代器作为参数,并返回一个迭代器,这样它生成所有输入的内容,就像来自于单个迭代器一样。 ```python from itertools import chain for i in chain([1, 2, 3], ['a', 'b', 'c']): print(i, end=' ') ``` 使用 `chain()` 可以轻松地处理多个序列,而不需要生成一个更大的序列。 ```python # OutPut 1 2 3 a b c ``` 如果要组合的迭代不是全部预先显式声明的,或者需要惰性计算的,则可以使用 `chain.from_iterable()` 来替换 `chain()` 。 ```python from itertools import ch...
j_hao104 发布于 1周前 阅读 474 点赞 1

优雅的处理你的Java异常

# 本文介绍 本文仅按照业务系统开发角度描述异常的一些处理看法.不涉及java的异常基础知识,可以自行查阅 **《Java核心技术 卷I》** 和 **《java编程思想》** 可以得到更多的基础信息. ## 写在前面的话 笔者文笔功力尚浅,言语多有不妥,请慷慨指正,必定感激不尽. 本文提出了几个概念: **处理反馈** **业务异常** **代码错误** ,请认真思考一下各中区别. 在开发业务系统中,我们目前绝大多数采用MVC模式,但是往往有人把service跟controller紧紧的耦合在一起,甚至直接使用Threadlocal来隐式传值,并且复杂的逻辑几乎只能使用service中存储的全局对象来传递处理结果,包括异常. 这样一来首先有违MVC模式,二来逻辑十分不清晰,难以维护.本文结合工作经验,给出一些异常使用建议,使用spring来实战异常为我们带来的好处. 常常,我们读罢了各种java的书,异常的各种机制,特性都很清楚,但是始终还是不知道如何使用,甚至背下了概念,却不知道如何致用. 我们开发的业务系统,或者是产品,常常面临着这样的问题: * 系统运行出错,但是完全不知道错误发生的位置. * 我们找到了错误的位置,但是完全不知道是因为什么. * 系统明明出了错误,但是就是看不到错误堆栈信息. ## 什么情况需要自定义异常 经常看...
叶知泉 发布于 2周前 阅读 2689 评论 19 点赞 6

解决Uncaught SyntaxError: Unexpected token var报错问题

开发的时候代码一点没有问题,也没有报错,但是放到服务器上以后就出现了Uncaught SyntaxError: Unexpected token var这个错误,看见这个错有点头疼,网上也没有具体的解决方法,只能硬着头皮找错误了,我仔细看了我的代码,逻辑一点问题都没有,括号闭合也是完整的,但就是报错,后来机缘巧合下,发现了问题的所在。上代码 原来服务器上面每个方法后面都需要使用分号隔开,而开发的时候有一些方法没有使用分号隔开,就导致了问题的出现,哭晕在厕所里面。 告诉大家一定要养成良好的开发习惯,该闭合的时候就闭合,该写的地方不要省略,分享给大家,不要在犯类似的错误了。
忻胜霄 发布于 3个月前 阅读 721

Spring Boot 2.0 整合 Spring Security Oauth2

是金子在哪都会发光的——每个说这句话的人都误以为自己是金子。
郑龙飞 发布于 2个月前 阅读 644 评论 8

xmake新增对WDK驱动编译环境支持

[xmake](https://github.com/tboox/xmake) v2.2.1新版本现已支持WDK驱动编译环境,我们可以直接在系统原生cmd终端下,执行xmake进行驱动编译,甚至配合vscode, sublime text, IDEA等编辑器+xmake插件去开发WDK驱动。 下面是xmake支持的一些编辑器插件,用户可以挑选自己喜欢的编辑器配合xmake来使用: * [xmake-idea](https://github.com/tboox/xmake-idea) * [xmake-vscode](https://github.com/tboox/xmake-vscode) * [xmake-sublime](https://github.com/tboox/xmake-sublime) ## WDK环境介绍 首先,我们先简单介绍下WDK10的编译环境的安装方式,我们可以看下微软的官方文档:[Download the Windows Driver Kit (WDK)](https://docs.microsoft.com/en-us/windows-hardware/drivers/download-the-wdk) 里面介绍了两种环境: 1. 下载WDK开发包,直接安装到系统并集成到VS的开发环境中 2. 下载EWDK iso镜像(内含完整WDK开发环境),直接挂载后,运行LaunchBuildEnv进入cmd环境 xmake对于这两种环境都是完全支持的,如果用户直接下载安装WDK环境到本地系统,那么不需要任何配置,只需要执行: ```bash $ xmake ``` xmake会自动检测到WDK的安装环境,然后编译相关驱动项目,...
ruki 发布于 1周前 阅读 210

使用DelayQueue 和 FutureTask 实现java中的缓存

使用DelayQueue、ConcurrentHashMap、FutureTask实现的缓存工具类。 DelayQueue 简介 DelayQueue是一个支持延时获取元素的无界阻塞队列。DelayQueue内部队列使用PriorityQueue来实现。队...
轨迹_ 发布于 2天前 阅读 67

centos 编译安装gcc8.1

gcc升级到8.1了,试试编译一下。 截止 2018-05-03 最新版本:https://mirrors.tuna.tsinghua.edu.cn/gnu/gcc/gcc-8.1.0/gcc-8.1.0.tar.gz 更多版本查找:http://ftp.gnu.org/gnu/gcc/ 另外可参考清华镜像,虽然不太全,但速度快:https://mirrors.tuna.tsinghua.edu.cn/gnu 安装基本编译环境 --- ``` yum install -y glibc-devel bison flex texinfo build-essential #gcc gcc-c++ make ``` 下载依赖库 --- ``` ./contrib/download_prerequisites ``` 默认使用ftp协议,有可能下载失败,可以考虑http下载。https://gcc.gnu.org/pub/gcc/infrastructure/ 根据提示下载依赖,注意提示失败的版本号: ``` wget https://mirrors.tuna.tsinghua.edu.cn/gnu/mpc/mpc-1.0.3.tar.gz tar xvfz mpc-1.0.3.tar.gz ln -s mpc-1.0.3 mpc wget https://mirrors.tuna.tsinghua.edu.cn/gnu/gmp/gmp-6.1.0.tar.bz2 tar xvfj gmp-6.1.0.tar.bz2 ln -s gmp-6.1.0 gmp wget https://mirrors.tuna.tsinghua.edu.cn/gnu/mpfr/mpfr-3.1.4.tar.bz2 tar xvfj mpfr-3.1.4.tar.bz2 ln -s mpfr-3.1.4 mpfr # 还有一个 isl-0.18.tar.bz2 清华镜像中没有 wget https://gcc.gnu.org/pub/gcc/infrastructu...
polly 发布于 2个月前 阅读 860

Redis实现分布式锁的几种方案

1.1方案一         利用setnx和expire命令实现加锁。当一个线程执行setnx返回1,说明key不存在,该线程获得锁;当一个线程执行setnx返回0,说明key已经存在,则获取锁失败。expire就是给锁加一个过期时间。伪代码如下: if(setnx(key,value)==1){ expire(key,expireTime) try{ //业务处理 }finally{ del(key) } }         该方案有一个致命问题,由于setnx和expire是两条Redis命令,不具备原子性,如果一个线程在执行完setnx()之后突然崩溃,导致锁没有设置过期时间,那么将会发生死锁。 1.2方案二         利用setnx命令加锁,其中key是锁,value是锁的过期时间,1.通过setnx()方法尝试加锁,如果当前锁不存在,返回加锁成功。2. 如果锁已经存在则获取锁的过期时间,和当前时间比较,如果锁已经过期,则设置新的过期时间,返回加锁成功。伪代码如下: long expires = System.currentTimeMillis() + expireTime; String expiresStr = String.valueOf(expires); // 如果当前锁不存在,返回加锁成功 if (setnx(key, expiresStr) == 1) { return true; } // 如果锁存...
筱虾米 发布于 2周前 阅读 117

大型跨境电商 JVM 调优经历

前提: 某大型跨境电商业务发展非常快,线上机器扩容也很频繁,但是对于线上机器的运行情况,特别是jvm内存的情况,一直没有一个统一的标准来给到各个应用服务的owner。经过618大促之后,和运维的同学讨论了下,希望将线上服务器的jvm参数标准化,可以以一个统一的方式给到各个应用,提升线上服务器的稳定性,同时减少大家都去调整jvm参数的时间。 参考了之前在淘宝天猫工作的公司的经历:经过大家讨论,根据jdk的版本以及线上机器配置,确定了一个推荐的默认jvm模版: 最终推荐的jvm模版: jdk版本 机器配置 建议jvm参数 备注 jdk1.7 6V8G -server -Xms4g -Xmx4g -Xmn2g -Xss768k -XX:PermSize=512m -XX:MaxPermSize=512m -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSClassUnloadingEnabled -XX:+DisableExplicitGC -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=68 -verbose:gc -XX:+PrintGCDetails -Xloggc:{CATALINA_BASE}/logs/gc.log -XX:+PrintGCDateStamps -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath={CATALINA_BASE}/logs 前台 jdk1.7 8V8G -server -Xms4g -Xmx4g -Xmn2g -Xss768k -XX:PermSize=512m -XX:MaxPermSize=...
yzbty23 发布于 3天前 阅读 51 评论 3

基于SpringBoot 2的管理后台系统

本文demo下载:http://www.wisdomdd.cn/Wisdom/resource/articleDetail.htm?resourceId=1062 一个基于SpringBoot 2 的管理后台系统,包含了用户管理,组织机构管理,角色管理,功能点管理,菜单管理,权限分配,数据权限分配,代码生成等功能 系统基于Spring Boot2技术,前端采用了Layui2。数据库以MySQL为实例,理论上是跨数据库平台. 基本技术栈来源于我为电子工业出版社编写的的<<Spring Boot 2 精髓 >> (这本书每一章也有各种例子,但Springboot-plus 更偏向于应用而不是教学) 当前版本:1.0.0 视频介绍:https://pan.baidu.com/s/1dFPoaT7 1 使用说明 1.1 安装说明 从Git上获取代码后,通过IDE导入此Maven工程,包含俩个子工程 admin-core ,核心包,包含了缓存,数据权限,公用的JS和HTML页面。 admin-console, 系统管理功能,包含了用户,组织机构,角色,权限,数据权限,代码生成等管理功能 com.ibeetl.admin.CosonleApplication 是系统启动类,在admin-console包下,在运行这个之前,还需要初始化数据库,位于doc/starter-mysql.sql,目前只提供mysql和oracle脚本。理论上支持所有数据库 还需要修改SpringBoot配置文件application.properties,修改你的数据库地址和访...
智慧点点 发布于 2个月前 阅读 434 评论 4 点赞 1

SpringBoot--Swagger2配置(解决404报错)

在 spring boot 项目中配置 Swagger2 突然出现了 404 报错, 究其原因,是因为 MVC 没有找到 swagger-ui 包中的 swagger-ui.html 文件;  以下就是 swagger2 的配置,及解决方案: 一, 引入Maven : <dependency> <!-- API --> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.7.0</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.7.0</version> </dependency> 二, 编写配置文件 : package com.gy.fast.common.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import io.swagger.annotations.ApiOperation; import springfox.documentation.builders.ApiInfoBuilder; import springfox.documentation.builders.PathSelectors; import springfox.documentation.builders.RequestHandlerSelectors; import springfox.documentation.service.ApiInfo; impor...
ge洋 发布于 1个月前 阅读 252

Enum、EnumMap、EnumSet

1、Enum 不带参数 public enum Car { AUDI { @Override public int getPrice() { return 25000; } }, MERCEDES { @Override...
职业搬砖20年 发布于 1天前 阅读 2

Java中的锁使用与实现

1. Lock接口 锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时访问共享资源。 在Lock出现之前,java程序是靠synchronized关键字实现锁功能的,而Java SE5之后,并发包中新增了Loc...
ZH-JSON 发布于 1天前 阅读 3

线程组和 ThreadLocal

前言 在上面文章中,我们从源码的角度上解析了一下线程池,并且从其 execute 方法开始把线程池中的相关执行流程过了一遍。那么接下来,我们来看一个新的关于线程的知识点:线程组。 线程组 ThreadGroup 我们前面已...
猴亮屏 发布于 1天前 阅读 1

6月25日至27日,为何全球开源大咖齐聚国家会议中心?LC3来啦!

广告
今年6月25日至27日, LinuxCon + ContainerCon + CloudOpen(LC3)将在北京国家会议中心召开。本次会议针对开源技术在人工智能和深度学习、区块链、云原生、虚拟服务器架构和微服务、新兴技术、基础实施和自动化、IoT和M2M、KVM、Linux系统、网络编排等10大前沿领域的应用,邀请了全球数百位业界大咖,用三天时间、超过200场分享,从市场、技术、产业甚至整个生态层面,将做全方位的探讨。
LinuxCon + ContainerCon + CloudOpen(LC3)

java程序员使用web3j进行以太坊开发详解

如何使用web3j为Java应用或Android App增加以太坊区块链支持,教程内容即涉及以太坊中的核心概念,例如账户管理包括账户的创建、钱包创建、交易转账,交易与状态、智能合约开发与交互、过滤器和事件等,同时也详细...
笔阁 发布于 1天前 阅读 2

浅谈数据结构-树

树是一种数据结构,其中一个元素可以有两个或者多个数据元素,具有一对多的特点,用树结构来存储文件。 树的概念 结点的度:子结点的个数。例如结点1中有3个子结点,结点1的度是3. 树的度:树的度等于所有结点度中...
猴亮屏 发布于 1天前 阅读 1

Java8新增的DateTimeFormatter与SimpleDateFormat的区别

两者最大的区别是,Java8的DateTimeFormatter也是线程安全的,而SimpleDateFormat并不是线程安全。 在并发环境下使用SimpleDateFormat 为了能够在多线程环境下使用SimpleDateFormat,有这三种方法: 方法一 在需要...
人觉非常君 发布于 2天前 阅读 8

多线程如何控制执行顺序

线程的生命周期说明: 当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态,在线程的生命周期中,它要经过新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和死亡...
MarinJ_Shao 发布于 2天前 阅读 4

Django第一期

安装Django 去https://www.djangoproject.com/download/ 下载最新版的Django,然后解压放到Anaconda\Lib\site-packages目录下,然后cmd进入此目录,输入安装命令: python setup.py install 安装成功后,配置系...
大不了敲一辈子代码 发布于 2天前 阅读 3

Spring AOP 源码分析 - 筛选合适的通知器

1.简介 从本篇文章开始,我将会对 Spring AOP 部分的源码进行分析。本文是 Spring AOP 源码分析系列文章的第二篇,本文主要分析 Spring AOP 是如何为目标 bean 筛选出合适的通知器(Advisor)。在上一篇AOP 源码分...
java高级架构牛人 发布于 2天前 阅读 5

Spring AOP 源码分析系列文章导读

1. 简介 前一段时间,我学习了 Spring IOC 容器方面的源码,并写了数篇文章对此进行讲解。在写完 Spring IOC 容器源码分析系列文章中的最后一篇后,没敢懈怠,趁热打铁,花了3天时间阅读了 AOP 方面的源码。开始以...
java高级架构牛人 发布于 2天前 阅读 5 评论 1

SpringBoot自动配置小记

spring-boot项目的特色就在于它的自动配置,自动配置就是开箱即用的本源。 不过支持一个子项目的自动配置,往往比较复杂,无论是sping自己的项目,还是第三方的,都是如此。刚接触会有点乱乱的感觉。简单记录一下...
大_于 发布于 2天前 阅读 9

Python3+Selenium+Phantomjs短信轰炸

短信轰炸,顾名思义就是让目标手机号不断接收短信,造成手机卡顿。 为了实现轰炸效果强烈,这里用多线程实现。 from selenium import webdriver import time from threading import Thread class Messa...
Eappo_Geng 发布于 2天前 阅读 3

MySQL 8下忘密码后重置密码的办法(MySQL5老方法不灵了)

MySQL密码重置思路 MySQL的密码是存放在user表里面的,修改密码其实就是修改表中记录。 重置的思路是是想办法不用密码进入系统,然后用数据库命令修改表user中的密码记录。 查了下,MySQL5系统在网上建议的方法是...
java高级架构牛人 发布于 2天前 阅读 2

一文带你搞定Integer

1.1 前言 Integer是int对应的包装类,它包含一个int类型的字段存储数据,并提供了多个基本操作,能在 int 类型和 String 类型之间互相转换。在Java5中,引入了自动装箱和自动拆箱功能,Java可根据上下文,自动进行...
筱虾米 发布于 2天前 阅读 121 评论 1

Thrift RPC实战(五) thrift连接池

Thrift本身没有提供连接池,我们可以用Apache Commons Pool2来实现一个 一、定义对象工厂 BasePooledObjectFactory extends BaseObject implements PooledObjectFactory public class TProtocolFactory ex...
lemonLove 发布于 2天前 阅读 7

Java中的锁使用与实现

1.Lock接口 锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时访问共享资源。 在Lock出现之前,java程序是靠synchronized关键字实现锁功能的,而Java SE5之后,并发包中新增了Lock接...
ZH-JSON 发布于 2天前 阅读 3

广州三本找Java实习经历

前言 只有光头才能变强 这阵子跑去面试Java实习生啦~~~我来简单介绍一下背景吧。 广州三本大三在读,在广州找实习。大学开始接触编程,一个非常平庸的人。 在学习编程时,跟我类似的人应该会有一个疑问:究竟学到...
Java3y 发布于 2天前 阅读 12

Thrift RPC实战(四) common-pool2连接池

我们在服务器开发的过程中,往往会有一些对象,它的创建和初始化需要的时间比较长,比如数据库连接,网络IO,大数据对象等。在大量使用这些对象时,如果不采用一些技术优化,就会造成一些不可忽略的性能影响。一种...
lemonLove 发布于 2天前 阅读 2

Failed to open/create Network-VirtualBox Host-Only

虚拟机版本 : Oracle Vm VirtualBox 5.2.12 报错时机:开网卡二,重启虚拟机报错 "Failed to open/create the internal network 'HostInterfaceNetworking-VirtualBox Host-Only Ethernet ...
p至尊宝 发布于 2天前 阅读 4

Golang UK Conf 2017- 如何在go1.7中正确使用Context包 [译]

@(Golang)[2018-4-15] 视频:https://www.youtube.com/watch?v=-_B5uQ4UGi0 博文:https://medium.com/@cep21/how-to-correctly-use-context-context-in-go-1-7-8f2c0fafdf39 为什么需要 Context 每一个长请求都应...
Markz0928 发布于 2天前 阅读 1

华为云」云中优选惠,全场低至2折,6.19-6.30开抢,签到抽P20

华为云年中钜惠,注册抽免费高配(2核4G)云服务器,单人成团2折起抢购热销云产品;云服务器、数据库、安全防护、大数据等150+云产品,更有精彩好礼送不停!
华为云

JPA、Hibernate、Spring data jpa之间的关系,终于明白了

什么么是JPA? 全称Java Persistence API,可以通过注解或者XML描述【对象-关系表】之间的映射关系,并将实体对象持久化到数据库中。 为我们提供了: 1)ORM映射元数据:JPA支持XML和注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中; 如:@Entity、@Table、@Column、@Transient等注解。  2)JPA 的API:用来操作实体对象,执行CRUD操作,框架在后台替我们完成所有的事情,开发者从繁琐的JDBC和SQL代码中解脱出来。 如:entityManager.merge(T t);  3)JPQL查询语言:通过面向对象而非面向数据库的查询语言查询数据,避免程序的SQL语句紧密耦合。 如:from Student s where s.name = ? 但是: JPA仅仅是一种规范,也就是说JPA仅仅定义了一些接口,而接口是需要实现才能工作的。所以底层需要某种实现,而Hibernate就是实现了JPA接口的ORM框架。 也就是说: JPA是一套ORM规范,Hibernate实现了JPA规范!如图: 什么是spring data jpa? spirng data jpa是spring提供的一套简化JPA开发的框架,按照约定好的【方法命名规则】写dao层接口,就可以在不写接口实现的情况下,实现对数据库的访问和操作。同时提供了很多除了CRUD之...
java思维导图 发布于 2周前 阅读 2734 评论 13 点赞 7

优雅的处理你的Java异常

# 本文介绍 本文仅按照业务系统开发角度描述异常的一些处理看法.不涉及java的异常基础知识,可以自行查阅 **《Java核心技术 卷I》** 和 **《java编程思想》** 可以得到更多的基础信息. ## 写在前面的话 笔者文笔功力尚浅,言语多有不妥,请慷慨指正,必定感激不尽. 本文提出了几个概念: **处理反馈** **业务异常** **代码错误** ,请认真思考一下各中区别. 在开发业务系统中,我们目前绝大多数采用MVC模式,但是往往有人把service跟controller紧紧的耦合在一起,甚至直接使用Threadlocal来隐式传值,并且复杂的逻辑几乎只能使用service中存储的全局对象来传递处理结果,包括异常. 这样一来首先有违MVC模式,二来逻辑十分不清晰,难以维护.本文结合工作经验,给出一些异常使用建议,使用spring来实战异常为我们带来的好处. 常常,我们读罢了各种java的书,异常的各种机制,特性都很清楚,但是始终还是不知道如何使用,甚至背下了概念,却不知道如何致用. 我们开发的业务系统,或者是产品,常常面临着这样的问题: * 系统运行出错,但是完全不知道错误发生的位置. * 我们找到了错误的位置,但是完全不知道是因为什么. * 系统明明出了错误,但是就是看不到错误堆栈信息. ## 什么情况需要自定义异常 经常看...
叶知泉 发布于 2周前 阅读 2689 评论 19 点赞 6

前端后台以及游戏中使用google-protobuf详解

### 前端后台以及游戏中使用google-protobuf详解 [TOC] #### 0、什么是protoBuf protoBuf是一种灵活高效的独立于语言平台的结构化数据表示方法,与XML相比,protoBuf更小更快更简单。你可以用定义自己protoBuf的数据结构,用ProtoBuf编译器生成特定语言的源代码,如C++,Java,Python等,目前protoBuf对主流的编程语言都提供了支持,非常方便的进行序列化和反序列化。 特点: - 平台无关、语言无关。 - 二进制、数据自描述。 - 提供了完整详细的操作API。 - 高性能 比xml要快20-100倍 - 尺寸小 比xml要小3-10倍 高可扩展性 - 数据自描述、前后兼容 #### 1、下载protobuf的编译器 [目前最新版本为Protocol Buffers v3.5.1](https://github.com/google/protobuf/releases) #### 2、配置环境变量 解压 `protoc-3.5.1-osx-x86_64.zip` Mac 配置环境变量 `vi ~/.bash_profile` 使其配置生效`source ~/.bash_profile` ```json #protobuf export PROTOBUF_HOME=/Users/Javen/Documents/dev/java/protobuf/protoc-3.5.1-osx-x86_64 export PATH=$PATH:$PROTOBUF_HOME/bin ``` Window 将bin添加到path 即可 例如:`D:\protobuf\protoc-3.5.1-win32\bin` `本文在Mac环境下编写` **Mac**...
Javen 发布于 2周前 阅读 1592 评论 5 点赞 2

Spring Boot使用过滤器和拦截器分别实现REST接口简易安全认证

本文通过一个简易安全认证示例的开发实践,理解过滤器和拦截器的工作原理。 很多文章都将过滤器(Filter)、拦截器(Interceptor)和监听器(Listener)这三者和Spring关联起来讲解,并认为过滤器(Filter)、拦截器(Interceptor)和监听器(Listener)是Spring提供的应用广泛的组件功能。 但是严格来说,过滤器和监听器属于Servlet范畴的API,和Spring没什么关系。 因为过滤器继承自javax.servlet.Filter接口,监听器继承自javax.servlet.ServletContextListener接口,只有拦截器继承的是org.springframework.web.servlet.HandlerInterceptor接口。 上面的流程图参考自网上资料,一图胜千言。看完本文以后,将对过滤器和拦截器的调用过程会有更深刻理解。 一、安全认证设计思路 有时候内外网调用API,对安全性的要求不一样,很多情况下外网调用API的种种限制在内网根本没有必要,但是网关部署的时候,可能因为成本和复杂度等问题,内外网要调用的API会部署在一起。 实现REST接口的安全性,可以通过成熟框架如Spring Security或者shiro搞定。 但是因为安全框架往往实现复杂(我数了下Spring Security,洋洋洒洒大概有11个核心模块,shiro的源码代码量也比较惊人)同时可能...
代码屠夫18 发布于 2周前 阅读 1394 评论 9 点赞 15

浅谈csrf攻击以及yii2对其的防范措施

> 凡是我yii2学习社群的成员都知道,我不止一次给大家说构造表单100%使用yii2的ActiveForm来实现,这除了能和AR更好结合外就是自动生成csrf隐藏域,一个非常安全的举措。 今天北哥就给大家普及下csrf是啥?如果你已经知道了可以直接拉文章到底部点个赞。:smile: **CSRF**(Cross-site request forgery跨站请求伪造)是一种对网站的恶意利用,在 2007 年曾被列为互联网 20 大安全隐患之一。 关于CSRF,要从一个故事开始~ # 老王丢钱事件 这个故事要从程序员老王丢了1万块钱说起,总之是进了小偷,找回无果。丢钱后的老王一直在思考,**钱是怎么丢的、为何丢钱、为何是我丢钱~~** 后来老王出现了严重的心理问题,他决定报复社会。 老王首先研究了网银系统,他发现转账是通过GET形式 ```php https://bank.abc.com/withdraw?account=liuxiaoer&amount=1000&to=abei ``` 这意思就是说将 **liuxiaoer** 的1000元钱转给**abei**,当然当请求到达银行服务器后,程序会验证该请求是否来自合法的session并且该session的用户就是 **liuxiaoer** 并且已经登录。 老王自己也有一个银行账号 **wang2**,他尝试登录并且通过浏览器发送请求给银行,代码如下 ```php https://bank.abc.com/wi...
阿北2017 发布于 3周前 阅读 1298 评论 5 点赞 1

京东Java架构师讲解购物车的原理及Java实现

今天来写一下关于购物车的东西, 这里首先抛出四个问题: 1)用户没登陆用户名和密码,添加商品, 关闭浏览器再打开后 不登录用户名和密码 问:购物车商品还在吗?  2)用户登陆了用户名密码,添加商品,关闭浏览器再打开后 不登录用户名和密码 问:购物车商品还在吗?    3)用户登陆了用户名密码,添加商品, 关闭浏览器,然后再打开,登陆用户名和密码  问:购物车商品还在吗? 4)用户登陆了用户名密码,添加商品, 关闭浏览器 外地老家打开浏览器  登陆用户名和密码 问:购物车商品还在吗? 上面四个问题都是以京东为模板, 那么大家猜猜结果是什么呢? 1)在 2)不在了 3)在 4)在 如果你能够猜到答案, 那么说明你真的很棒, 那么关于这四点是怎么实现的呢? (如果有不认可的小伙伴可以用京东实验一下) 下面我们就来讲解下购物车的原理,最后再来说下具体的code实现. 1)用户没有登录, 添加商品, 此时的商品是被添加到了浏览器的Cookie中, 所以当再次访问时(不登录),商品仍然在Cookie中, 所以购物车中的商品还是存在的. 2)用户登录了,添加商品, 此时会将Cookie中和用户选择的商品都添加到购物车中, 然后删除Cookie中的商品. 所以当用户再次访问(不登录),此时Cooki...
Java工程师-Distance 发布于 1个月前 阅读 9715 评论 55 点赞 18

这些年一直记不住的 Java I/O

本文目录 参考资料 前言 从对立到统一,字节流和字符流 从抽象到具体,数据的来源和目的 从简单到丰富,使用 Decorator 模式扩展功能 Java 7 中引入的 NIO.2 NIO.2 中的异步 I/O 总结 参考资料   该文中的内容来源于 Oracle 的官方文档。Oracle 在 Java 方面的文档是非常完善的。对 Java 8 感兴趣的朋友,可以从这个总入口Java SE 8 Documentation开始寻找感兴趣的内容。这一篇主要讲 Java 中的 I/O,官方文档在这里Java I/O, NIO, and NIO.2。 前言   不知道大家看到这个标题会不会笑我,一个使用 Java 多年的老程序员居然一直没有记住 Java 中的 I/O。不过说实话,Java 中的 I/O 确实含有太多的类、接口和抽象类,而每个类又有好几种不同的构造函数,而且在 Java 的 I/O 中又广泛使用了 Decorator 设计模式(装饰者模式)。总之,即使是在 OO 领域浸淫多年的老手,看到下面这样的调用一样会蛋疼: BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("somefile.txt")));   当然,这仅仅只是我为了体现 Java I/O 的错综复杂的构造函数而虚构出来的一个例子,现实中创建一个 BufferedReader 很少会嵌套这么深,因为可以直接...
Java工程师-Distance 发布于 1个月前 阅读 3129 评论 11 点赞 14

10款常见MySQL高可用方案选型解读

一、概述 我们在考虑MySQL数据库的高可用架构时,主要考虑如下几方面: 如果数据库发生了宕机或者意外中断等故障,能尽快恢复数据库的可用性,尽可能的减少停机时间,保证业务不会因为数据库的故障而中断。 用作备份、只读副本等功能的非主节点的数据应该和主节点的数据实时或者最终保持一致。 当业务发生数据库切换时,切换前后的数据库内容应当一致,不会因为数据缺失或者数据不一致而影响业务。 关于对高可用的分级我们暂不做详细的讨论,这里只讨论常用高可用方案的优缺点以及选型。 二、高可用方案 1 、主从或主主半同步复制 使用双节点数据库,搭建单向或者双向的半同步复制。在5.7以后的版本中,由于lossless replication、logical多线程复制等一些列新特性的引入,使得MySQL原生半同步复制更加可靠。 常见架构如下: 通常会和Proxy、Keepalived等第三方软件同时使用,即可以用来监控数据库的健康,又可以执行一系列管理命令。如果主库发生故障,切换到备库后仍然可以继续使用数据库。 优点: 架构比较简单,使用原生半同步复制作为数据同步的依据 双节点,没有主机宕机后的选主问题,直接切换即可 双节点,需求资源少,部署简单 缺点: 完全依赖于半同步复制,如果...
烂猪皮 发布于 2个月前 阅读 4370 评论 10 点赞 7

如何用Nginx搭建一个安全的、快速的微服务架构

本文改编自Chris Stetson发表在nginx.conf 上的一个有关如今的微服务以及如何使用Nginx构建一个快速的、安全的网络系统的演讲,大家可以在YourTube上回看此次演讲。 自我介绍 Chris Stetson:Hi,我的名字是Chris Stetson,我在Nginx带领专业服务部门,同时也领导微服务实践。 今天我们要谈论微服务以及如何使用Nginx构建一个快速的、安全的网络系统。在我们谈话的最后,我们将与我们在Zokets的合作伙伴向您展示一个使用Fabric模式如何非常快速和轻松地构建一个微服务的demo。 在我们探讨Fabric模式之前,我想谈一谈微服务并且从Nginx的角度来看这意味着什么。 0:56 - 大转变 微服务已经引起了应用程序架构的重大转变。 当我第一次开始构建应用程序时,他们都是差不多的。幻灯片中所展示的单体架构也象征了应用程序的构造方式。 目前存在着某种类型的虚拟机(VM),对我来说,就是通常的Java。在虚拟机中应用的功能组件以对象的形式存在,这些对象是在内存中相互通讯的,它们将来来回回处理并进行方法调用。偶尔,你会采用诸如通知等机制来接触到其他系统以便获取数据或传递信息。 有了微服务之后,应用程序如何构建的范式是完全不同的了。你的功能组件会从在同一个主机的...
烂猪皮 发布于 2个月前 阅读 4991 评论 12 点赞 4

List集合就这么简单【源码剖析】

前言 声明,本文用得是jdk1.8 前一篇已经讲了Collection的总览:Collection总览,介绍了一些基础知识。 现在这篇主要讲List集合的三个子类: ArrayList 底层数据结构是数组。线程不安全 LinkedList 底层数据结构是链表。线程不安全 Vector 底层数据结构是数组。线程安全 这篇主要来看看它们比较重要的方法是如何实现的,需要注意些什么,最后比较一下哪个时候用哪个~ 看这篇文章之前最好是有点数据结构的基础:Java实现单向链表,栈和队列就是这么简单,二叉树就这么简单         当然了,如果讲得有错的地方还请大家多多包涵并不吝在评论去指正~ 一、ArrayList解析     首先,我们来讲解的是ArrayList集合,它是我们用得非常非常多的一个集合~ 首先,我们来看一下ArrayList的属性:     根据上面我们可以清晰的发现:ArrayList底层其实就是一个数组,ArrayList中有扩容这么一个概念,正因为它扩容,所以它能够实现“动态”增长 1.2构造方法 我们来看看构造方法来印证我们上面说得对不对:     1.3Add方法 add方法可以说是ArrayList比较重要的方法了,我们来总览一下:     1.3.1add(E e) 步骤: 检查是否需要扩容 插入元素 首先,我们来看看这个方法: ...
Java3y 发布于 2个月前 阅读 2531 评论 4 点赞 6

约瑟夫环的几种实现方式

约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。通常解决这类问题时我们把编号从0~n-1,最后 [1] 结果+1即为原问题的解。
珂jack 发布于 3个月前 阅读 2348 评论 18

深入浅出设计模式——从球赛中悟代理模式

代理模式提供了通过代理对象访问目标对象的访问方式。
珂jack 发布于 3个月前 阅读 1739 评论 8 点赞 5

总结:JDK1.5-JDK1.8各个新特性

引用: 此文章意在借鉴前人经验,留作日后查看。 https://my.oschina.net/91jason/blog/309821
iwen-J 发布于 3个月前 阅读 5586 评论 1 点赞 33

关于elasticsearch中更新数据的几种方式

作为一个成熟的框架,Elasticsearch里面提供了丰富的操作数据的api,本篇我们就来学习一下在es中更新数据的几种方式。 (一)更新文档 (1)部分更新: java api: ```` ` HashMap data=new HashMap<>(); data.put("name","woshigcs"); data.put("age",25); UpdateRequestBuilder urb= client.prepareUpdate("active2018-03-21", "active", "18"); urb.setDoc(data); urb.execute().actionGet(); System.out.println("update ok......"); ```` 注意部分更新功能,前提是索引和该条数据已经存在,否则会抛出对应的异常,只要任何一个不满足,都会更新失败。 curl: ```` curl -XPOST 'localhost:9200/test/type1/1/_update' -d '{ "doc" : { "name" : "new_name" } } ```` (2)使用detect_noop java api: ```` ` HashMap data=new HashMap<>(); data.put("name","woshigcs"); data.put("age",25); UpdateRequestBuilder urb= client.prepareUpdate("active2018-03-21", "active", "18"); urb.setDoc(data); urb.setDetectNoop(false);//默认是true urb.execute().actionGet(); System.out.println("update ok......"); ```` curl方式: ```` curl -XPOST 'localhost:9200...
九劫散仙 发布于 3个月前 阅读 3292 评论 5

Lucene就是这么简单

什么是Lucene?? Lucene是apache软件基金会发布的一个开放源代码的全文检索引擎工具包,由资深全文检索专家Doug Cutting所撰写,它是一个全文检索引擎的架构,提供了完整的创建索引和查询索引,以及部分文本分析的引擎,Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎,Lucene在全文检索领域是一个经典的祖先,现在很多检索引擎都是在其基础上创建的,思想是相通的。 Lucene是根据关健字来搜索的文本搜索工具,只能在某个网站内部搜索文本内容,不能跨网站搜索 既然谈到了网站内部的搜索,那么我们就谈谈我们熟悉的百度、google那些搜索引擎又是基于什么搜索的呢....         从图上已经看得很清楚,baidu、google等搜索引擎其实是通过网络爬虫的程序来进行搜索的... 为什么我们要用Lucene? 在介绍Lucene的时候,我们已经说了:Lucene又不是搜索引擎,仅仅是在网站内部进行文本的搜索。那我们为什么要学他呢??? 我们之前编写纳税服务系统的时候,其实就已经使用过SQL来进行站内的搜索.. 既然SQL能做的功能,我们还要学Lucene,为什么呢??? 我们来看看我们用SQL来搜索...
Java3y 发布于 3个月前 阅读 2601 评论 14 点赞 9

泥瓦匠聊并发编程基础篇:线程中断和终止

原文:[www.spring4all.com](http://www.spring4all.com) ### 1 线程中断 #### 1.1 什么是线程中断? 线程中断是线程的标志位属性。而不是真正终止线程,和线程的状态无关。线程中断过程表示一个运行中的线程,通过其他线程调用了该线程的 `interrupt()` 方法,使得该线程中断标志位属性改变。 深入思考下,线程中断不是去中断了线程,恰恰是用来通知该线程应该被中断了。具体是一个标志位属性,到底该线程生命周期是去终止,还是继续运行,由线程根据标志位属性自行处理。 #### 1.2 线程中断操作 调用线程的 `interrupt()` 方法,根据线程不同的状态会有不同的结果。 下面新建 InterruptedThread 对象,代码如下: ```java /** * 一直运行的线程,中断状态为 true * * @author Jeff Lee @ bysocket.com * @since 2018年02月23日19:03:02 */ public class InterruptedThread implements Runnable { @Override // 可以省略 public void run() { // 一直 run while (true) { } } public static void main(String[] args) throws Exception { Thread interruptedThread = new Thread(new InterruptedThread(), "InterruptedThread"); interruptedThread.start(); TimeUnit.SE...
SpringForAll 发布于 4个月前 阅读 2149 评论 2 点赞 4

如何优雅的设计 Java 异常

导语 异常处理是程序开发中必不可少操作之一,但如何正确优雅的对异常进行处理确是一门学问,笔者根据自己的开发经验来谈一谈我是如何对异常进行处理的。 由于本文只作一些经验之谈,不涉及到基础知识部分,如果读者对异常的概念还很模糊,请先查看基础知识。 如何选择异常类型 异常的类别 正如我们所知道的,java中的异常的超类是java.lang.Throwable(后文省略为Throwable),它有两个比较重要的子类,java.lang.Exception(后文省略为Exception)和java.lang.Error(后文省略为Error),其中Error由JVM虚拟机进行管理,如我们所熟知的OutOfMemoryError异常等,所以我们本文不关注Error异常,那么我们细说一下Exception异常。 Exception异常有个比较重要的子类,叫做RuntimeException。我们将RuntimeException或其他继承自RuntimeException的子类称为非受检异常(unchecked Exception),其他继承自Exception异常的子类称为受检异常(checked Exception)。本文重点来关注一下受检异常和非受检异常这两种异常。 如何选择异常 从笔者的开发经验来看,如果在一个应用中,需要开发一个方法(如某个功能的service方法),这个方法如果中间可能出现异常,那么你需要考虑这个异常出现之后是否调...
美的让人心动 发布于 4个月前 阅读 6327 评论 26 点赞 11

分布式事务 TCC-Transaction 源码分析 —— 事务恢复

摘要: 原创出处 http://www.iocoder.cn/TCC-Transaction/transaction-recovery/ 「芋道源码」欢迎转载,保留摘要,谢谢! **本文主要基于 TCC-Transaction 1.2.3.3 正式版** - [1. 概述](http://www.iocoder.cn/TCC-Transaction/transaction-recovery/) - [2. 事务重试配置](http://www.iocoder.cn/TCC-Transaction/transaction-recovery/) - [3. 事务重试定时任务](http://www.iocoder.cn/TCC-Transaction/transaction-recovery/) - [4. 异常事务恢复](http://www.iocoder.cn/TCC-Transaction/transaction-recovery/) - [4.1 加载异常事务集合](http://www.iocoder.cn/TCC-Transaction/transaction-recovery/) - [4.2 恢复异常事务集合](http://www.iocoder.cn/TCC-Transaction/transaction-recovery/) - [666. 彩蛋](http://www.iocoder.cn/TCC-Transaction/transaction-recovery/) ------- ![](https://user-gold-cdn.xitu.io/2018/2/22/161bc087b2b30dd1?w=750&h=330&f=jpeg&s=78520) > 🙂🙂🙂关注**微信公众号:【芋道源码】**有福利: > 1. RocketMQ / MyCAT / Sharding-JDBC **所有**源码分析文章列表 > 2. RocketMQ / MyCAT / Sharding-JDBC **中文注释源码 ...
芋道源码 发布于 4个月前 阅读 1930 评论 2 点赞 1

JDBC【数据库连接池、DbUtils框架、分页】

1.数据库连接池 什么是数据库连接池 简单来说:数据库连接池就是提供连接的。。。 为什么我们要使用数据库连接池 数据库的连接的建立和关闭是非常消耗资源的 频繁地打开、关闭连接造成系统性能低下 编写连接池 编写连接池需实现java.sql.DataSource接口 创建批量的Connection用LinkedList保存【既然是个池,当然用集合保存、、LinkedList底层是链表,对增删性能较好】 实现getConnetion(),让getConnection()每次调用,都是在LinkedList中取一个Connection返回给用户 调用Connection.close()方法,Connction返回给LinkedList private static LinkedList<Connection> list = new LinkedList<>(); //获取连接只需要一次就够了,所以用static代码块 static { //读取文件配置 InputStream inputStream = Demo1.class.getClassLoader().getResourceAsStream("db.properties"); Properties properties = new Properties(); try { properties.load(inputStream); String url = properties.getProperty("url"); String username = properties.getProperty("username"); St...
Java3y 发布于 4个月前 阅读 2533 评论 3 点赞 3

JSON入门看这一篇就够了

什么是JSON JSON:JavaScript Object Notation 【JavaScript 对象表示法】 JSON 是存储和交换文本信息的语法。类似 XML。 JSON采用完全独立于任何程序语言的文本格式,使JSON成为理想的数据交换语言S 为什么需要JSON 提到JSON,我们就应该和XML来进行对比。XML也是一种存储和交换文本信息的手段。那么JSON好在哪里呢?? JSON 比 XML 更小、更快,更易解析。 javaScript原生支持JSON,解析速度会很快 XML解析成DOM对象的时候,浏览器【IE和fireFox】会有差异 使用JSON会更简单     更加容易创建JavaScript对象 var p = {'city':['北京','上海','广州','深圳']}; for(var i=0;i<p.city.length;i++){ document.write(p.city[i]+"<br/>"); } JSON语法 客户端与服务端的交互数据无非就是两种 数组 对象 于是乎,JSON所表示的数据要么就是对象,要么就是数组 JSON语法是javaScript语法的子集,javaScript用[]中括号来表示数组,用{}大括号来表示对象,JSON亦是如此 JSON数组: var employees = [ { "firstName":"Bill" , "lastName":"Gates" }, { "firstName":"George" , "lastName":"Bush" }, { "firstName":"Thomas" , "lastName": "Carter" } ]; JSON对象 ...
Java3y 发布于 4个月前 阅读 1794 评论 13 点赞 3
顶部