并发编程-锁

1 基础知识

1.1 锁的宏观分类

锁从宏观上分类,可以分为悲观锁与乐观锁。

乐观锁是一种乐观思想,认为读多写少,遇到并发写的可能性低。每次读数据的时候,都认为别的线程没有修改过数据,所以不会上锁;但是写数据的时候会判断一下其他线程有没有更新过该数据。java中的乐观锁基本上都是使用CAS实现的。

悲观锁就是一种悲观思想,认为写多读少,遇到并发写的可能性高。每次读数据的时候都认为会被其他线程修改,所以每次读写都会上锁。

1.2 java线程阻塞的代价

明确java线程切换的代价,是理解java中各种锁的优缺点的基础。

java的线程是映射到操作系统原生线程上的,如果要阻塞或唤醒一个线程就需要操作系统介入,操作系统需要在用户态与核心态之间转换,这种切换会消耗大量的系统资源,这是因为用户态与核心态有各自的内存区域、寄存器等资源,用户态切换至内核态需要传递给许多变量、参数给内核,内核也需要保护好用户态在切换时的一些寄存器值、变量等,以便内核态调用结束后切换回用户态继续工作。

查看更多

并发编程-线程中断

中断标志就是线程对象的一个成员变量,它表示一个运行中的线程是否被被其他线程进行了中断操作。中断好比其他线程对该线程打了个招呼,其他线程通过调用该线程对象的interrupt()方法对其进行中断操作。

线程通过检查自身是否被中断来进行响应,线程通过对象方法 isInterrupted()来进行判断是否被中断。

在线程中调用静态方法 Thread.interrupted() 对当前线程的中断标识进行复位。

中断与响应中断是异步的。

本文将从以下两个方面来介绍Java中对线程中断机制的具体实现:

查看更多

并发编程-ThreadLocal原理

ThreadLocal是一个本地线程副本变量工具类,ThreadLocal的实例代表了一个线程局部的变量,主要用于将私有线程和该线程存放的副本对象做一个映射,各个线程之间的变量互不干扰,在高并发场景下,可以实现无状态的调用,特别适用于各个线程依赖不通的变量值完成操作的场景。

1. 是什么

  • 是让线程拥有独占的变量
  • 它通过set、get方法进行设值和取值操作
  • 它可以覆盖initialValue方法设置初始值,在没进行set之前调用get会调用初始化方法,一个线程只会调用一次
查看更多

Mybatis-TypeHandler<T>的使用

orm框架需要解决的问题之一就是数据库中的数据类型与java数据类型相互转换,以Mysql为例:

JdbcType.Varchar类型与String类型需要相互转换,mybatis内置了StringTypeHandler来处理这种转换

JdbcType.double类型与Double或double类型转换,内置有DoubleTypeHandler

。。。

在实际开发中,会遇到一些特殊类型的转换,例如:

查看更多

Mybatis-MyBatisGenerator的使用

使用MyBatisGenerator可以根据数据库中的table自动生成entity、dao以及mapper映射器文件,简单配置就能实现

首先引入依赖:

1
2
3
4
5
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.5</version>
</dependency>

引入插件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<build>
<plugins>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.5</version>
<configuration>
<configurationFile>src/main/resources/generator-config.xml</configurationFile>
<verbose>true</verbose>
<overwrite>true</overwrite>
</configuration>
</plugin>
</plugins>
</build>

查看更多

SpringBoot-自定义starter

1. 命名

SpringBoot提供的starter以spring-boot-starter-xxx的方式命名的。

官方建议自定义的starter使用xxx-spring-boot-starter命名规则。以区分SpringBoot生态提供的starter。

2. 开发

  • 编写properties 属性类(@ConfigurationProperties)

    1
    2
    3
    4
    5
    6
    @ConfigurationProperties(prefix = "demo")
    @Data
    public class DemoProperties {
    private String what;
    private String who;
    }

查看更多

NAT原理概述

1 概述

1.1 简介

1.1.1 名词解释

公有IP地址:也叫全局地址,是指合法的IP地址,它是由NIC(网络信息中心)或者ISP(网络服务提供商)分配的地址,对外代表一个或多个内部局部地址,是全球统一的可寻 址的地址。

私有IP地址:也叫内部地址,属于非注册地址,专门为组织机构内部使用。因特网分配编号委员会(IANA)保留了3块IP地址做为私有IP地址:

10.0.0.0 ——— 10.255.255.255

172.16.0.0——— 172.16.255.255

192.168.0.0———192.168.255.255

查看更多

正则表达式基础

正则表达式在几乎所有语言中都可以使用,无论是前端的JavaScript、还是后端的Java、c#。他们都提供相应的接口/函数支持正则表达式。

但很神奇的是:无论你大学选择哪一门计算机语言,都没有关于正则表达式的课程给你修,在你学会正则之前,你只能看着那些正则大师们,写了一串外星文似的字符串,替代了你用一大篇幅的if else代码来做一些数据校验

既然喜欢,那就动手学呗,可当你百度出一一堆相关资料时,你发现无一不例外的枯燥至极,难以学习。

本文旨在用最通俗的语言讲述最枯燥的基本知识!

正则基础知识点:

1.元字符

万物皆有缘,正则也是如此,元字符是构造正则表达式的一种基本元素。
我们先来记几个常用的元字符:

查看更多

java-SimpleDateFormat的用法以及线程安全

开发中我们经常会用到时间相关类,我们有很多办法在Java代码中获取时间。但是不同的方法获取到的时间的格式都不尽相同,这时候就需要一种格式化工具,把时间显示成我们需要的格式。最常用的方法就是使用SimpleDateFormat类。这是一个看上去功能比较简单的类,但是,一旦使用不当也有可能导致很大的问题。

在阿里巴巴Java开发手册中,有如下明确规定:
image
本文就围绕SimpleDateFormat的用法、原理等来深入分析下如何以正确使用它。

1. SimpleDateFormat用法

1.1 基本用法

SimpleDateFormat是java提供的能对时间格式化及解析的工具类。

  • 格式化:将规范日期格式化成日期文本(时间字符串)

查看更多