目录 简介 单例模式的延迟加载 double check模式 静态域的实现 ThreadLocal版本 简介 双重检测锁定模式是一种设计模式,我们通过首次检测锁定条件而不是实际获得锁从而减少获取锁的开销. 双重检查锁定模式用法通常用于实现执行延迟初始化的单例工厂模式.延迟初始化推迟了成员字段或成员字段引用的对象的构造,直到实际需要才真正的创建. 但是我们需要非常小心的使用双重检测模式,以避免发送错误. 单例模式的延迟加载 先看一个在单线程正常工作的单例模式: public class Book…
目录 简介 java平台本身的安全性 安全第一,不要写聪明的代码 在代码设计之初就考虑安全性 避免重复的代码 限制权限 构建可信边界 封装 写文档 简介 作为一个程序员,只是写出好用的代码是不够的,我们还需要考虑到程序的安全性.在这个不能跟陌生人说话世界,扶老奶奶过马路都是一件很困难的事情.那么对于程序员来说,尤其是对于开发那种对外可以公开访问的网站的程序员,要承受的压力会大很多. 任何人都可以访问我们的系统,也就意味着如果我们的系统不够健壮,或者有些漏洞,恶意攻击者就会破门而入,将我们辛辛苦苦…
目录 简介 可变对象和不可变对象 创建mutable对象的拷贝 为mutable类创建copy方法 不要相信equals 不要直接暴露可修改的属性 public static fields应该被置位final public static final field 应该是不可变的 简介 mutable(可变)和immutable(不可变)对象是我们在java程序编写的过程中经常会使用到的. 可变类型对象就是说,对象在创建之后,其内部的数据可能会被修改.所以它的安全性没有保证. 而不可变类型对象就是说…
目录 简介 使用变长编码的不完全字符来创建字符串 char不能表示所有的Unicode 注意Locale的使用 文件读写中的编码格式 不要将非字符数据编码为字符串 简介 字符串是我们日常编码过程中使用到最多的java类型了.全球各个地区的语言不同,即使使用了Unicode也会因为编码格式的不同采用不同的编码方式,如UTF-8,UTF-16,UTF-32等. 我们在使用字符和字符串编码的过程中会遇到哪些问题呢?一起来看看吧. 使用变长编码的不完全字符来创建字符串 在java中String的底层存储…
目录 简介 在字符串标准化之后进行校验 注意不可信字符串的格式化 小心使用Runtime.exec() 正则表达式的匹配 简介 为了保证java程序的安全,任何外部用户的输入我们都认为是可能有恶意攻击意图,我们需要对所有的用户输入都进行一定程度的校验. 本文将带领大家探讨一下用户输入校验的一些场景.一起来看看吧. 在字符串标准化之后进行校验 通常我们在进行字符串校验的时候需要对一些特殊字符进行过滤,过滤之后再进行字符串的校验. 我们知道在java中字符是基于Unicode进行编码的.但是在Uni…
目录 简介 不可变对象的可见性 保证共享变量的复合操作的原子性 保证多个Atomic原子类操作的原子性 保证方法调用链的原子性 读写64bits的值 简介 java类中会定义很多变量,有类变量也有实例变量,这些变量在访问的过程中,会遇到一些可见性和原子性的问题.这里我们来详细了解一下怎么避免这些问题. 不可变对象的可见性 不可变对象就是初始化之后不能够被修改的对象,那么是不是类中引入了不可变对象,所有对不可变对象的修改都立马对所有线程可见呢? 实际上,不可变对象只能保证在多线程环境中,对象使用的…
目录 简介 不同的加锁顺序 使用private类变量 使用相同的Order 释放掉已占有的锁 简介 java中为了保证共享数据的安全性,我们引入了锁的机制.有了锁就有可能产生死锁. 死锁的原因就是多个线程锁住了对方所需要的资源,然后现有的资源又没有释放,从而导致循环等待的情况. 通常来说如果不同的线程对加锁和释放锁的顺序不一致的话,就很有可能产生死锁. 不同的加锁顺序 我们来看一个不同加锁顺序的例子: public class DiffLockOrder { private int amount…
目录 简介 使用private final object来作为lock对象 不要synchronize可被重用的对象 不要sync Object.getClass() 不要sync高级并发对象 不要使用Instance lock来保护static数据 在持有lock期间,不要做耗时操作 正确释放锁 简介 在java多线程环境中,lock和同步是我们一定会使用到的功能.那么在java中编写lock和同步相关的代码之后,需要注意哪些问题呢?一起来看看吧. 使用private final object…
目录 简介 start一个Thread 不要使用ThreadGroup 不要使用stop()方法 wait 和 await 需要放在循环中调用 简介 java中多线程的开发中少不了使用Thread,我们在使用Thread中提供的API过程中,应该注意些什么规则呢? 一起来看一看吧. start一个Thread Thread中有两个方法,一个是start方法,一个是run方法,两个都可以调用,那么两个有什么区别呢? 先看一下start方法: public synchronized void sta…
目录 简介 linux下的文件基本权限 linux文件的特殊权限 Set UID 和 Set GID Sticky Bit SUID/SGID/SBIT权限设置 文件隐藏属性 特殊文件 java中在共享目录中使用文件要注意的问题 安全目录 简介 java程序是跨平台的,可以运行在windows也可以运行在linux.但是平台不同,平台中的文件权限也是不同的.windows大家经常使用,并且是可视化的权限管理,这里就不多讲了. 本文主要讲讲linux下面的文件的权限和安全性问题,并且探讨一下如何在…