Java内存区域

Java内存区域 JVM的内存区域包含六大运行时区域 程序计数器(Pragram Counter Register) ​ 程序计数器是相对较小的一块内存空间,可以当作是当前线程所执行的字节码的行号指示器。也就是说字节码解析器可以通过改变计数器的值来选择下一条需要执行的字节码指令,我们常见的分支(if)、循环(for)、异常处理、线程恢复等基本功能都需要程序计数器的支持。 由于程序计数器描述的是当前线程的指示器,那么在多线程情况下,每个线程都会拥有一个独立存储、互不影响的计数器来记录之前执行的位置,当线程切换后能正确恢复到正确的执行位置,因而程序计数器是线程私有的内存区域。 在Java虚拟机规范中,程序计数器是唯一一块没有规定任何OutOfMemoryError的 内存区域。 线程执行Java方法时,计数器记录的值是正在执行的虚拟机字节码指令的地址;线程执行本地方法时,计数器记录的值则为空(Undefined)。 虚拟机栈(Virtual Machine Stack) ​...

1 minute read

并发编程

并发编程 共享资源:多个线程同时对同一份资源进行访问(读写操作) 线程安全:多个线程共享资源时,都能体现出和单线程一样的正确性-所见即所知 线程安全问题:多线程共享资源时,出现脏数据或不可遇见的结果。(线程安全问题实际上是没有任何同步措施地共享资源) 多线程活跃性问题: 死锁:多个线程互相持有对方所需要的资源,导致这些线程处于等待状态,无法前往执行 活锁:资源不断在两个线程中跳动,没有一个线程可以同时拿到所有资源而正常执行 饥饿:一个线程,由于种种原因,一直无法获得所需要的资源 并发级别分类: 阻塞:在其它线程释放资源之前,当前线程无法执行 无饥饿:要想获得资源,所有线程都要排队,这样所有线程都有机会执行 无障碍:最弱无阻塞调度,所有线程都可以进入临界区,如果一起修改共享资源则各自都进行回滚操作 无锁:无锁没有对资源进行锁定 ,所有线程都可以进入临界区,尝试修改,永不言弃,且保证必有一个线程在有限步类能完成操作离开临界区 无等待:在无锁的基础上进行扩展,要求所有线程都必须在有限步内完成...

2 minute read

详解java各种集合的线程安全

详解java各种集合的线程安全 线程安全 首先要明白线程的工作原理,jvm有一个main memory,而每个线程有自己的working memory,一个线程对一个variable进行操作时,都要在自己的working memory里面建立一个copy,操作完之后再写入main memory。多个线程同时操作同一个variable,就可能会出现不可预知的结果。根据上面的解释,很容易想出相应的scenario。 而用synchronized的关键是建立一个monitor,这个monitor可以是要修改的variable也可以其他你认为合适的object比如method,然后通过给这个monitor加锁来实现线程安全,每个线程在获得这个锁之后,要执行完load到workingmemory -> use&assign -> store到mainmemory 的过程,才会释放它得到的锁。这样就实现了所谓的线程安全。 什么是线程安全?线程安全是怎么完成的(原理)? 线程安全就是说多线程访问同一代码,不会产生不确定的结果。编写线程安全的代码是低依靠线程同步。...

1 minute read

自定义注解

自定义注解[转] 自定义注解:   使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口,由编译程序自动完成其他细节。在定义注解时,不能继承其他的注解或接口。@interface用来声明一个注解,其中的每一个方法实际上是声明了一个配置参数。方法的名称就是参数的名称,返回值类型就是参数的类型(返回值类型只能是基本类型、Class、String、enum)。可以通过default来声明参数的默认值。   定义注解格式:   public @interface 注解名 {定义体}   注解参数的可支持数据类型:     1.所有基本数据类型(int,float,boolean,byte,double,char,long,short)     2.String类型     3.Class类型     4.enum类型     5.Annotation类型     6.以上所有类型的数组...

2 minute read

Java线程池

Java线程池 Java四中线程池 (1)FixedThreadPool 由Executors的newFixedThreadPool方法创建。它是一种线程数量固定的线程池,当线程处于空闲状态时,他们并不会回收,除非线程池被关闭。当所有的线程都处于活动状态时,新的任务都会处于等待状态,直到有线程空闲出来。FixedThreadPool只有核心线程,且该核心线程都不会被回收,这意味着它可以更快地响应外界的请求。jdk实现如下: public static ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFactory) { return new ThreadPoolExecutor(nThreads,...

3 minute read

Java线程

Java线程 java中创建线程的三种方法以及区别 Java使用Thread类代表线程,所有的线程对象都必须是Thread类或其子类的实例。 Java可以用三种方式来创建线程,如下所示: 1)继承Thread类创建线程 2)实现Runnable接口创建线程 3)使用Callable和Future创建线程 下面让我们分别来看看这三种创建线程的方法: 继承Thread类创建线程 通过继承Thread类来创建并启动多线程的一般步骤如下: (1)定义Thread类的子类,并重写该类的run()方法,该方法的方法体就是线程需要完成的任务,run()方法也称为线程执行体。 (2)创建Thread子类的实例,也就是创建了线程对象 (3)启动线程,即调用线程的start()方法 代码实例 public...

2 minute read

Java注解辨析

Java注解辨析 1.@PathVariable与@PathParam、@RequestParam @RequestParam 看下面一段代码: http://localhost:8080/springmvc/hello/101?param1=10¶m2=20 根据上面的这个URL,你可以用这样的方式来进行获取 public String getDetails( @RequestParam(value="param1", required=true) String param1, @RequestParam(value="param2", required=false)...

1 minute read

如何设计系统

系统设计心得 1.通过划分实体和确定领域边界,确定设计的业务实体 2.对每个业务实体设计增、删、改、查接口,并且在这些接口前面增加修饰词 3.考虑接口支持批量操作

1 minute read