Tag - Java

Java    2019-07-15 17:29:40    6    0    0

最近面试被一位牛逼的面试官吊起来打了……

记录一下其中一道题目, 当时虽然想象出结果了, 但是不敢确定。

最近终于停下来了一会, 又想起来这道题目, 干脆用代码来证明一下自己的想法确实没有错。

  1. public class VideoApplicationTest {
  2. private volatile int count = 5;
  3. @Test
  4. public void testReentrant() {
  5. Runnable syncTask = this::reentrantSyncFunc;
  6. ExecutorService executorService = Executors.newFixedThreadPool(10);
  7. for (int i = 0; i < 3; i++)
  8. executorService.execute(syncTask);
  9. }
  10. public synchronized void reentrantSyncFunc() {
  11. count--;
  12. if (count > 0) {
  13. System.out.println("currentThread: " + Thread.currentThread().getName());
  14. System.out.println("currentCount: " + count);
  15. System.out.println(Thread.currentThread().getName() + " continue");
  16. reentrantSyncFunc();
  17. } else {
  18. System.out.println("currentThread: " + Thread.currentThread().getName());
  19. System.out.println("currentCount: " + count);
Java 设计模式    2019-05-06 17:46:52    7    0    0

单例模式

单例模式算是最简单的一种设计模式了。

基本上所有讲设计模式的文章或者博客都会把他放到最前面。

虽然这种模式最简单, 但是很多地方都能够用到, 比如说曾经风靡于各个博客公众号和各类管理系统的Shiro框架, 有经典的 Spring, 都广泛的使用了单例模式。

这篇文章, 将会按照是什么, 为什么, 怎么做来讲解单例模式。

什么是单例模式

单例模式的定义是什么呢?

引用自 Wikipedia - 单例模式 :

单例模式, 也叫单子模式, 是一种常用的软件设计模式。在应用这个模式时, 单例对象的类必须保证只有一个实例存在。

为什么是单例模式

同样引用自 Wikipedia - 单例模式, 单例模式的作用 :

许多时候整个系统只需要拥有一个的全局对象, 这样有利于我们协调系统整体的行为。比如在某个服务器程序中, 该服务器的配置信息存放在一个文件中, 这些配置数据由一个单例对象统一读取, 然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理。

怎么做出一个单例

1.抽象类

最简单粗暴的方式, 利用JVM的类加载原理, 写一个抽象类, 这个类是天然单例, 且一定能保证在JVM的生命周期内是单例。

这种方式最常用在需要全局唯一的工具类中, 如ShiroSecurityUtil

  1. public abstract class Singleton {
  2. public static Object doSomething(){
  3. // doSomething...
  4. }
  5. }

2.使用final关键字

参考Wikipedia - 单例模式 Java 实现

又名饿汉模式

这种方法的好处在于我们不需要担心单例类无意间被继承而失去全局唯一的特性, 同时还可以自由的在单例中添加非静态方法。

  1. public class Singleton {
  2. pri
Java    2019-05-06 14:36:38    7    0    0

Java到底是值传递还是引用传递

目录:


我第一次见到这个问题其实应该追溯到当年在培训机构的时候,讲师的一句话。

在这之后很长一段时间我都没有怎么去深究这方面的问题。

后来有一天很偶然的想起来有这么一件事情, 就顺手查了一下 StackOverflow, Wikipedia 和知乎。

引用传递还是值传递

Wikipedia:

Wikipedia 上求值策略词条关于传值调用的描述:

传值调用(Call by value)

"传值调用"求值是最常见的求值策略, C和Scheme这样差异巨大的语言都在使用。在传值调用中实际参数被求值,其值被绑定到函数中对应的变量上(通常是把值复制到新内存区域)。如果函数或过程能把值赋给它的形式参数, 则被赋值的只是局部拷贝——就是说, 在函数返回后调用者作用域里的曾传给函数的任何东西都不会变。

传值调用不是一个单一的求值策略, 而是指一类函数的实参在被传给函数之前就被求值的求值策略。尽管很多使用传值调用的编程语言(如Common Lisp、Eiffel、Java)从左至右的求值函数的实际参数,某些语言(比如OCaml)从右至左的求值函数和它们的实际参数, 而另一些语言(比如Scheme和C)未指定这种次序(尽管它们保证顺序一致性)。

Wikipedia 上求值策略词条关于传引用调用的描述:

传引用调用(Call by reference)

在"传引用调用"求值中, 传递给函数的是它的实际参数的隐式引用而不是实参的拷贝。通常函数能够修改这些参数(比如赋值), 而且改变对于调用者是可见的。因此传引用调用提供了一种调用者和函数交换数据的方法。传引用调用的语言中追踪函数调用的副

Java JWT    2019-04-28 14:36:00    6    0    0

手写一个 Java JWT

第一次正式听说 JWT 是因为某个不记得名字的公众号推的一篇文章 - 《讲真, 别再使用JWT了!》

在这之前我虽然知道 OAuth2, 但却不知道这种携带 token 进行校验的方式有一个这么正经的名字 - Json Web Token(简称JWT)

JWT的官方网站: jwt.io

非常简洁, 就像这套标准的思想一样简洁。

祖师爷赏饭, 自然是要发扬吃饱了就要造轮子的精神, 自己手动实现一个 Java 版的 JWT

惊不惊喜,意不意外

再说一个更惊喜更意外的事情——

我手头排了一堆想做的事情,等轮到这个项目都不知道什么时候了哈哈哈

����

Spring Websocket Java    2019-02-20 22:46:59    7    0    0

Spring集成WebSocket即时推送

一、后端

1.代码部分

(1) 新建WebSocketHandler,实现WebSocketHandler接口或继承TextWebSocketHandler类

​ 若实现WebSocketHandler则需实现其中方法

  1. // 建立连接
  2. @Override
  3. public void afterConnectionEstablished(WebSocketSession session) throws Exception
  4. {}
  5. // 从客户端获取消息
  6. @Override
  7. public void handleMessage(WebSocketSession session, WebSocketMessage<?> message)
  8. throws Exception
  9. {}
  10. // 连接异常
  11. @Override
  12. public void handleTransportError(WebSocketSession session, Throwable exception)
  13. throws Exception
  14. {}
  15. // 连接关闭
  16. @Override
  17. public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus)
  18. throws Exception
  19. {}
  20. // 消息是否分片
  21. @Override
  22. public boolean supportsPartialMessages()
  23. {
  24. return false;
  25. }

​ 若继承TextWebSocketHandler则重写其中方法

  1. // 从客户端接收到文本消息
  2. @Override
  3. protected void handleTextMessage(WebSocketSession session, TextMessage message)
  4. throws Exception
  5. {}

(2) 新建WebSocketInterceptor,实现HandshakeInterceptor接口或继承HttpSessionHandshakeIn

Shiro Java CORS 跨域    2019-02-20 22:46:57    3    0    0

shiro前后分离跨域预检不带cookies处理办法

解决参考网站地址:

前端配置:

  1. //(必备)此配置允许跨域请求带上Cookie
  2. withCredentials: true

后台配置:

第一步: web.xml Filter过滤器调整顺序: CORSFilter在shiroFilter 之前

  1. <!--解决跨域访问 -->
  2. <filter>
  3. <filter-name>crossorigin</filter-name>
  4. <filter-class>com.woke.util.CORSFilter</filter-class>
  5. </filter>
  6. <filter-mapping>
  7. <filter-name>crossorigin</filter-name>
  8. <url-pattern>/*</url-pattern>
  9. </filter-mapping>
  10. <!-- 配置shiro过滤器 -->
  11. <filter>
  12. <filter-name>shiroFilter</filter-name>
  13. <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
  14. <init-param>
  15. <param-name>targetFilterLifecycle</param-name>
  16. <param-value>true</param-value>
  17. </init-param>
  18. <init-param>
  19. <param-name>targetBeanName</param-name>
  20. <param-value>shiroFilter</param-value>
  21. </init-param>
  22. </filter>
  23. <filter-mapping>
  24. <filt