首先,需要说明一点,也是最重要的一点,无论是同步方法 还是 同步块 都是只针对同一个对象的多线程而言的,只有同一个对象产生的多线程,才会考虑到 同步方法 或者是 同步块,如果定义多个实例的同步,可以考虑使用mutex,创建类似于c++整个服务全局锁,或者创建一个全局单例类,在其内定义全局锁.比如以下的代码片段定义线程同步无任何意义: public class Test1 implements Runnable {    public void run() { synchronized(this)…
问题起源 事情得从一个多线程编程里面臭名昭著的问题"Lost wake-up problem"说起. 这个问题并不是说只在Java语言中会出现,而是会在所有的多线程环境下出现. 假如我们有两个线程,一个消费者线程,一个生产者线程.生产者线程的任务可以简化成将count加一,而后唤醒消费者:消费者则是将count减一,而后在减到0的时候陷入睡眠,代码如下: 生产者伪代码: count+1; notify(); 消费者伪代码: while(count<=0) wait() count…
CountDownLatch介绍 在前面的Java学习笔记中,总结了Java中进行多线程同步的几个方法: 1.synchronized关键字进行同步. 2.Lock锁接口及其实现类ReentrantLock.ReadWriteLock锁实现同步. 3.信号量Semaphore实现同步. 其中,synchronized关键字和Lock锁解决的是多个线程对同一资源的并发访问问题.信号量Semaphore解决的是多副本资源的共享访问问题. 今天,来学习一下Java中的另外一个多线程同步辅助类:Coun…
Java中"指针"的解释以及对"引用"的理解 初学Java面对对象编程,对于一些概念还真的有点难以理解,主要是因为不由自主的联系到以前学过的C语言知识,时不时的影响着自己对Java语言的认识,如今自己对于Java的一些概念解释和理解记录下来,以便于以后回顾: 一.引用: 在Java语言的教材中关于创建对象格式是这样规定的: 类名 引用变量 = new 类名(); 对于这句话的解释是:创建一个对象,将对象的地址赋值给引用变量,此时变量就持有了对象的引用:而此时我们就可…
锁的基础知识 锁的类型 锁从宏观上分类,只分为两种:悲观锁与乐观锁. 乐观锁 乐观锁是一种乐观思想,即认为读多写少,遇到并发写的可能性低,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,采取在写时先读出当前版本号,然后加锁操作(比较跟上一次的版本号,如果一样则更新),如果失败则要重复读-比较-写的操作.Java中的乐观锁基本都是通过CAS操作实现的,CAS是一种更新的原子操作,比较当前值跟传入值是否一样,一样则更新,否则失败. 悲观…
一.先比较String.StringBuffer.StringBuilder变量的HashCode值 使用System.out.println(obj.hashcode())输出的时对象的哈希码, 而非内存地址.在Java中是不可能得到对象真正的内存地址的,因为Java中堆是由JVM管理的不能直接操作. 只能说此时打印出的Hash码表示了该对象在JAVA虚拟机中的内存位置,Java虚拟机会根据该hash码最终在真正的的堆空间中给该对象分配一个地址. 但是该地址 是不能通过java提供的api获取…
Java中使用String作同步锁 在Java中String是一种特殊的类型存在,在jdk中String在创建后是共享常量池的,即使在jdk1.8之后实现有所不同,但是功能还是差不多的. 借助这个特点我们可以使用String来作同步的锁,比如更新用户信息的时候,可以使用用户的名称作为同步锁,这样不同的用户就可以使用不同的锁,提升并发性能.这个特点扩展开来适当的场景就非常之多了. 只不过正因为String的特殊性,java还包含了更多的与字符串相关的工具类,如StringBuffer.String…
使用 Arrays 类操作 Java 中的数组语法: Arrays.sort(数组名); 可以使用 sort( ) 方法实现对数组的排序,只要将数组名放在 sort( ) 方法的括号中,就可以完成对该数组的排序(按升序排列) //导入Arrays类import java.util.Arrays; // 定义一个字符串数组String[] hobbies = { "sports", "game", "movie" }; // 使用Arrays类的s…
转自:http://blog.csdn.net/mrzhoug/article/details/51581994 一.在Java中,使用”{}”括起来的代码称为代码块,代码块可以分为以下四种: 1.普通代码块:就是类中方法的方法体   public void xxx(){       //code   } 2.构造块:用{}裹起来的代码片段,构造块在创建对象时会被调用,每次创建对象时都会被调用,并且优先于类构造函数执行. 构造块中定义的变量是局部变量.  {      //code   } 3.…
Java中的继承.封装.多态 继承的理解: 1.继承是面向对象的三大特征之一,也是实现代码复用的重要手段.Java的继承具有单继承的特点,每个子类只有一个直接父类. 2.Java的继承通过extends关键字来实现,实现继承的类被称为子类,被继承的类称为父类(有的也称其为基类.超类),父类和子类的关系,是一种一般和特殊的关系.就像是水果和苹果的关系,苹果继承了水果,苹果是水果的子类,水果是苹果的父类,则苹果是一种特殊的水果. 3.Java使用extends作为继承的关键字,extends关键字在…