持续提升技术,完善知识体系
Java技术

» java

选择所属分类: java

tomcat tools maven spring quartz zookeeper redis linux webservice dubbo mysql others nginx jvm springcloud hbase kubernetes hadoop clickhouse design vue
2020-11-21 06:01
关于java多线程编程中的volatile

1、关于java多线程编程中的volatile Java中的多线程编程是一个非常复杂的问题,因为多个线程同时访问同一个变量可能会导致数据不一致。为了解决这个问题,Java提供了许多同步机制来保护共享资源。其中一个关键字就是volatile。在本文中,我们将详细讨论Java中的volatile关键字以及它如何解决多线程编程中的问题。 什么是volatile? 在Java中,volatile是一个关键字,用于声明变量。当一个变量被声明为volatile时,它会立即被线程更新。这意味着当一个线程改变volatile变量的值时,其他线程可以立即看到这个变化。换句话说,volatile变量的值是实时可见的。 volatile的用途 volatile关键字主要用于解决共享资源在多线程环境中的同步问题。在Java中,多个线程可能同时访问同一个变量或对象,这可能导致多个线程看到的数据不一致。一个线程的修改可能会影响其他线程的数据,这就是典型的脏读和写问题。 使用volatile关键字可以确保变量在所有线程中的可见性和一致性。当一个变量被声明为volatile时,每个线程都会读取和修改同一个内存位置,而不是读取缓存中的副本。因此,只要一个线程改变了这个变量,其他线程就能立即看到这个变化。 volatile变量与非volatile变量之间的区别 在Java中,大部分变量都是非volatile的。这意味着它们的值可以缓存,这可能会导致数据不一致的问题。当一个线程修改了一个非volatile变量的值时,其他线程可能无法立即看到这个变化,因为每个线程都有它自己的缓存副本。 而当一个变量被声明为volatile时,其值会被所有线程共享,这样就可以避免数据不一致的问题。此外,使用volatile关键字还可以确保在执行多个操作时,不会发生乱序执行的情况,因为所有的读写操作都是按照程序次序执行的。 需要注意的是,虽然volatile可以保证线程的可见性和一致性,但是它并不能保证原子性。当多个线程同时修改一个volatile变量时,可能会存在竞态条件。因此,在这种情况下,需要使用更高级别的同步机制,比如synchronized关键字或者锁。 结论 在多线程编程中,数据一致性是一个非常重要的问题。volatile关键字可以确保变量的可见性和一致性,从而避免数据不一致的问题。使用volatile关键字可以使多线程编程更加简单和可靠,但需要注意它不能保证原子性,如果需要原子性的话,需要使用更高级别的同步机制。 2、示例代码 当我们在多线程编程中使用volatile关键字,可以确保变量的可见性和一致性。这里给出一个简单的Java volatile的示例代码: public class MyThread extends...

2020-11-13 11:12
关于使用CompletableFuture过程中线程等待的问题

关于使用CompletableFuture过程中线程等待的问题 在电商的应用场景中,通过异步多线程获取服务端信息比较常见,如用户打开个人中心查看个人综合信息,可能会展示用户的账户余额、优惠券、积分、消费红包等等信息,这时服务端就会通过异步线程将所需信息汇总后一并返回给用户。如果按单线程逐一返回个人信息,用户等待的时间显然是不能接受的,通过异步多线程的方式大大减少请求的响应时间。 jdk8简化了异步任务的写法,提供了很多异步任务的计算方式。 1、示例(先从一个简单测试示例代码,查看运行的结果) import lombok.extern.slf4j.Slf4j; import java.time.Duration; import java.time.Instant; import java.util.ArrayList; import java.util.List; import java.util.Random; import java.util.concurrent.CompletableFuture; @Slf4j public...

2020-11-12 22:15
Kubernetes-v1.19.3集群使用kubeadm安装

Kubernetes-v1.19.3集群使用kubeadm安装 1、基础环境准备 1.1、机器说明,共三台机器一台master,两台node节点 机器说明 ip 系统 master 192.168.80.10 centos7.8 node1 192.168.80.20 centos7.8 node2 192.168.80.30 centos7.8 [root@kubernetes-master ~]# cat /etc/redhat-release CentOS...

2020-11-12 22:15
IntegerCache使用的问题与源码解读

IntegerCache使用的问题与源码解读 1、使用中的代码演示 class IntegerTest { public static void main(String[] args) { Integer a = 88; Integer b = new Integer(88);...

2020-11-12 22:15
SpringCloudStream使用kafka

SpringCloudStream使用kafka 1、安装应用环境 1.1、安装zookeeper 1)、下载最新版本安装包apache-zookeeper-3.6.1-bin.tar.gz 2)、解压到安装目录,并将conf目录下文件zoo_sample.cfg拷贝一份命名为zoo.cfg,此文件为zookeeper配置文件 3)、进入安装目录bin中启动zookeeper, ./zkServer.sh start 1.2、安装kafka 1)、下载最新版本安装包kafka_2.13-2.5.0.tgz 2)、解压到安装目录,并完成config/server.properties基本配置 3)、进入安装目录bin中启动kafka ./kafka-server-start.sh ../config/server.properties 2、spring-cloud中使用kafka完成消息发送与接收 2.1、demo程序代码如下 pom.xml <?xml version="1.0" encoding="UTF-8"?>...

2017-10-14 22:15
SpringCloud中应用Rabbitmq实现延时消息的两种方式

SpringCloud中应用Rabbitmq实现延时消息的两种方式 1、使用队列的ttl特性【延时队列】 使用队列的ttl特性,即配置死信队列的消息重新路由到消费队列中,同一个队列的消息过期时间将相同,即使消息本身可能带上了ttl,同样会因队头的消息未过期而无法消费; 关键配置说明 spring: cloud: stream: bindings: input: destination: delay_message_queue_input group: test-service output: destination: delay_message_queue_output producer: required-groups: test-service rabbit:...

2016-05-17 19:55
Spring Security配置使用介绍(四)增加验证码

Spring Security配置使用介绍(四)增加验证码 本文基于此前介绍过spring security动态配置权限,使用的方法是增加过滤拦截对权限进行处理, 此篇介绍基于上一篇已实现动态权限配置,增加验证码功能。 1、实现spring-security验证码功能,只需要增加一个过滤器便可。此过滤继承UsernamePasswordAuthenticationFilter,在验证用户名密码之前验证码校验, java代码实现如下 ValidateCodeAuthenticationFilter.java package com.hode.security; import java.util.Date; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.lang.StringUtils; import org.springframework.security.core.Authentication;...

2016-05-16 23:02
使用javaagent参数保存二进制class文件

使用javaagent参数保存二进制class文件 使用-javaagent 参数用户可以在执行main函数前执行一些其他操作,如可以动态的修改替换类中代码。既然可以修改类那么自然就可以获取到类(class二进制)了。 本文同样使用maven去打一个包 1、编写pom.xml,此处仅仅是定义一个jar工程 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.hode</groupId> <artifactId>clazzagent</artifactId> <version>0.0.1-SNAPSHOT</version> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version>...

2016-05-16 21:55
Spring Security配置使用介绍(三)暴力动态配置权限(修改源码不推荐)

Spring Security配置使用介绍(三)暴力动态配置权限(修改源码不推荐) 前面介绍过spring security动态配置权限,使用的方法是增加过滤拦截对权限进行处理, 此篇介绍修改源码实现动态权限,部分代码基于上一篇进行修改,帮助理解spring security。 1、此方法修改源码,不需要另外增加拦截器,我们先在applicationContext-security.xml配置好已有权限,再动态调整其权限。 applicationContext-security.xml内容如下 <?xml version="1.0" encoding="UTF-8"?> <beans:beans xmlns="http://www.springframework.org/schema/security" xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.2.xsd"> <http...

2016-05-16 20:55
Spring Security配置使用介绍(二)动态配置权限

Spring Security配置使用介绍(二)动态配置权限 本文接上文Spring Security配置使用介绍(一)简单配置, 由上一篇介绍,在配置文件applicationContext-security.xml中配置了intercept-url pattern=”/**” access=”isAuthenticated()”,表示需登录授权访问, 这是一个非常简单的权限控制,实际使用中我们需要增加角色并配置相应的权限。 在上文中的demo中的代码可以看到,login.jsp中定义了用户名为1,而在类UserDetailsServiceImpl中new User()中填入的用户名为admin,这主要是因为 spring-security并不验证用户名,可从源码中看到(查看源代码验证密码部分,关键代码在 org.springframework.security.authentication.dao.DaoAuthenticationProvider.additionalAuthenticationChecks(UserDetails, UsernamePasswordAuthenticationToken)方法中),此时会将admin 保存到session中。 根据上一篇所介绍的简单使用,本文在此基础上完成配置,文章后面将附上源码以供下载学习 1、其中pom.xml、log4j.properties、applicationContext.xml、applicationContext-mvc.xml、web.xml不作修改。 2、修改applicationContext-security.xml,增加配置过滤拦截器完成对请求的拦截,内容如下 applicationContext-security.xml <?xml version="1.0"...

2016-05-15 21:02
Spring Security配置使用介绍(一)简单配置

Spring Security配置使用介绍(一)简单配置 Spring Security,这是一种基于Spring AOP和Servlet过滤器的安全框架。它提供全面的安全性解决方案,同时在Web请求级和方法调用级处理身份确认和授权。 在Spring Framework基础上,Spring Security充分利用了依赖注入(DI,Dependency Injection)和面向切面技术。 简单来说Spring Security是通过众多的拦截器对请求的url进行拦截,以此达到权限管理的目的,下面一步步介绍Spring Security使用。 1、编写pom.xml,主要有spring及其security相关依赖 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.hode</groupId>...

2016-05-11 19:55
Spring4 + cxf3 构建wsdl webservice

Spring4 + cxf3 构建wsdl webservice 本文介绍通过spring4.0.2 + apache cxf3.0.3构建一个wsdl webservice服务。 项目的结构如下: jaxws-client:客户端 jaxws-interface:公共接口 jaxws-server:服务端 说明:客户端与服务端均使用公共接口中的定义 1、新建一个maven项目jaxws-interface 其中pom.xml如下 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"...

2016-05-04 20:41
Spring4 + cxf3 构建restful webservice

Spring4 + cxf3 构建restful webservice 本文介绍通过spring4.0.2 + apache cxf3.0.3构建一个restful webservice服务。 项目的结构如下: jaxrs-client:客户端 jaxrs-interface:公共接口 jaxrs-server:服务端 说明:客户端与服务端均使用公共接口中的定义 1、新建一个maven项目jaxrs-interface 其中pom.xml如下 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"...

2016-04-25 19:08
Spring + quartz注解配置使用

Spring + quartz注解配置使用 本文接文spring4+quartz2基本配置及应用,使用注解配置 1、编写一个定时器执行类,重要的是使用Scheduled注解 AnnotationQueryJob.java package com.hode.job; import org.apache.log4j.Logger; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @Component public class AnnotationQueryJob { private...

2016-04-24 20:12
Spring + Activemq注解配置使用

Spring + Activemq注解配置使用 本文接文Spring + Activemq基本使用,将消息接收配置简化,使用注解配置 1、首先升级spring所依赖包版本,将上文中pom.xml的spring版本改为4.3.1.RELEASE,旧版本中无@JmsListener注解,其余依赖不变 2、编写一个消息监听类,此类使用了注解JmsListener,并指定了队列名 ReceiveMessageAnnotationListener.java package com.hode.listener; import javax.jms.JMSException; import javax.jms.Message; import javax.jms.ObjectMessage; import javax.jms.TextMessage; import...

2016-04-23 20:01
JDK动态代理及cglib动态代理实现分析

JDK动态代理及cglib动态代理实现分析 代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问,动态代理使得开发人员无需手工编写代理类便可动态地获得代理类,下面就JDK动态代理与CGLIB动态代理展开分析。 1、JDK动态代理分析 JDK动态代理依靠接口实现,所以仅支持实现了接口的动态代理,下面用一个常用的JDK动态代理实现进行分析 实现InvocationHandler实现调用处理器 InvocationHandlerImpl.java ppackage com.qerooy.handler; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import org.apache.log4j.Logger; /** * 动态代理类调用处理器 */ public class...

2016-04-22 21:23
Spring+Dubbo annotation配置

Spring+Dubbo annotation配置 本文继dubbo spring配置使用,上文中使用的xml,dubbo提供了注解方式使代码更加简洁 1、编写pom.xml,其中包括spring、dubbo基础包,pom.xml内容请参考上文(在此省略) 2、编写一个简单的服务 FooService.java package com.hode.dubbo.provider; public interface FooService { public String sayHello(String name); } FooServiceImpl.java,注意需使用alibaba的Service注解 package...

2016-04-21 21:23
Dubbo管理控制台(dubbo-admin)

Dubbo的管理控制台(Dubbo Admin) dubbo spring配置使用文章介绍过使用dubbo构建简单服务, 创建了服务提供者及消费者,dubbo提供了管理后台管理服务提供者与消费者 可在http://dubbo.io/Download-zh.htm(不保证此地址一直可用)直接下载 dubbo-admin-2.5.3.war 放到tomcat目录中并启动,在此就不多作介绍tomcat的部署了, 也可以将dubbo源码下载到本地,自行打war包放到tomcat中部署,本文介绍根据源码部署dubbo-admin 1、通过git下载dubbo源码(确认已安装git客户端),命令 git clone https://github.com/alibaba/dubbo dubbo 2、源码下载完成后,可直接在dubbo根目录install,命令 mvn install -Dmaven.test.skip 正确完成install后,在目录/dubbo/dubbo-admin/target/中已打好包dubbo-admin-2.5.4-SNAPSHOT.war(本文以最新git版本库中获取代码为例) 将此war包放置到tomcat目录中,启动tomcat即可。...

2016-04-19 21:03
Dubbo全Spring配置方式

Dubbo的Spring配置方式 DUBBO是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,是阿里巴巴SOA服务化治理方案的核心框架。 1、编写pom.xml,其中包括spring、dubbo基础包,pom.xml内容如下 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.hode</groupId> <artifactId>dubbo</artifactId> <version>0.0.1-SNAPSHOT</version> <properties> <spring.version>4.0.2.RELEASE</spring.version> <log4j.version>1.2.17</log4j.version> </properties> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId>...

2016-04-18 07:23
Springmvc restful使用swagger生成在线文档

Spring4 mvc构建restful webservice应用使用swagger生成在线文档 本文接上一篇已实现spring构建restful webservice应用,本篇代码在上一篇的基础上完成,最后同样给出demo代码。 1、下载上文中的demo代码,或点此下载Demo代码下载 为了测试方便将demo代码中pom.xml配置文件中的标签 <scope>provided</scope> 去掉,直接执行以下命令运行服务端,可查看demo代码是否正常运行。 mvn clean compile exec:java -Dexec.mainClass="com.hode.JettyServer" 2、在pom.xml中添加swagger及相关依赖,如下 <dependency> <groupId>com.mangofactory</groupId> <artifactId>swagger-springmvc</artifactId> <version>0.9.4</version> </dependency>...

2016-04-18 07:13
Springmvc构建restful webservice应用

Spring4 mvc构建restful webservice应用 本文演示使用spring mvc开发一个简单的restful webservice服务,本例使用Jetty作为调试测试,通过使用RestTemplate完成服务调用。 1、编写pom.xml,其中包括spring、json解析所需的包,pom.xml内容如下 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.hode</groupId> <artifactId>spring-rest</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <properties> <spring.version>4.0.2.RELEASE</spring.version> <log4j.version>1.2.17</log4j.version>...

2016-04-17 03:11
Spring + Activemq基本使用

Spring + Activemq基本使用 1、安装,Apache activemq的安装比较简单,下载压缩包apache-activemq-5.12.1-bin.tar.gz到目录/software cd /software tar -xzvf apache-activemq-5.12.1-bin.tar.gz cd /software/apache-activemq-5.12.1/bin ./activemq start 启动完成后,进入控制台 http://192.167.48.128:8161/admin/ 会提示录入用户名及密码,用户名及密码均为admin,即可查看队列信息 2、编写一个消息发送端,在此演示发送一个字符串及一个对象,对象需序列化。 编写pom.xml <project...

2016-04-14 23:32
Spring4+jedis实现分布式锁

Spring4+jedis实现分布式锁 本文实现接Spring4+jedis基本操作 1、编写一个简单的锁控制类,此处简单实现,暂忽略异常处理,释放资源异常等等。 package com.hode; import org.springframework.dao.DataAccessException; import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.core.RedisCallback; import org.springframework.data.redis.core.RedisTemplate; public class RedisLock { private final static...

2016-04-13 23:32
Spring4+jedis基本操作

Spring4+jedis基本操作 首先安装好redis,并启动 1、编写pom.xml文件,添加jedis、spring等配置,pom文件如下 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.hode</groupId> <artifactId>spring-jedis</artifactId> <version>0.0.1-SNAPSHOT</version> <properties> <spring.version>4.0.2.RELEASE</spring.version> </properties> <dependencies> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> <version>1.6.1.RELEASE</version>...

2016-04-05 17:05
使用spring-test测试springmvc

使用spring-test测试springmvc web应用开发人员在开发过程中需要测试各种请求,通常需要使用web服务器部署后进行调试,本文介绍基于SpringMVC与Spring Test框架编写单元测试对springmvc进行测试。 1、创建maven项目,pom.xml如下 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.qerooy</groupId> <artifactId>mvctest</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <properties> <spring.version>4.0.2.RELEASE</spring.version> <log4j.version>1.2.17</log4j.version> </properties> <dependencies> <dependency>...

2016-04-04 21:11
spring+mybaits配置

spring+mybaits配置 本文介绍spring+mybatis配置,数据库使用mysql,mybatis代码使用mybatis-generator生成 1、创建maven项目,加入spring、mybatis、mysql、proxool依赖,并加入mybatis-generator插件,pom.xml如下 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.qerooy</groupId> <artifactId>spring-mybatis</artifactId> <version>0.0.1-SNAPSHOT</version> <properties> <spring.version>4.0.2.RELEASE</spring.version> <mybatis.version>3.2.2</mybatis.version> <mybatis-spring.version>1.2.0</mybatis-spring.version> <log4j.version>1.2.17</log4j.version> <mysql.version>5.1.29</mysql.version> <proxool.version>0.9.1</proxool.version> </properties>...

2016-04-02 06:51
spring4+quartz2基本配置及应用

spring4+quartz2基本配置及应用 1、新建maven工程,添加spring4.0及quartz2.2依赖,pom.xml文件内容如下 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.qerooy</groupId> <artifactId>spring-quartz</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <properties> <spring.version>4.0.2.RELEASE</spring.version> <log4j.version>1.2.17</log4j.version> <quartz.version>2.2.1</quartz.version> </properties> <dependencies> <dependency> <groupId>org.springframework</groupId>...

2015-11-15 21:00
Twitter的RPC框架Finagle简单使用介绍

Twitter的RPC框架Finagle简单使用介绍 本文接上篇Apache Thrift使用介绍,部分代码与上篇一样。 本例演示使用maven构建一个finagle简单例子,同样使用与上文相同的例子 1、编写pom.xml文件 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.hode</groupId> <artifactId>finagle</artifactId> <version>0.0.1-SNAPSHOT</version> <properties> <finagle.version>6.30.0</finagle.version> <scrooge.version>4.2.0</scrooge.version> </properties> <dependencies> <dependency>...

2015-11-12 20:10
Apache thrift软件框架简单使用介绍

Apache thrift软件框架简单使用介绍 Thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发。它结合了功能强大的软件堆栈和代码生成引擎, 以构建在 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml 等等编程语言间无缝结合的、高效的服务。...