Java线程同步 (synchronized wait notify)
注:wait notify 都是Object的方法
同步(阻塞) :是一种防止对共享资源访问导致的数据不一致的一种模式。
详细请参看操作系统。
在Java中,由于对多线程的支持,对同步的控制主要通过以下几个方法,synchronized,和wait(),notify()和notifyAll(),下面进行一一的讲解:
A关键字synchronized
每个java对象都有一把锁, 当有多个线程同时访问共享资源的时候, 需要Synchronize 来控制安全性, synchronize 分 synchronize 方法 和synchronize块,使用synchronize块时, 一定要显示的获得该对象的锁(如synchronize(object))而方法则不需要。
java的内存模型是对每一个进程有一个主内存, 每个线程有自己的内存, 他们从主内存中取数据, 然后计算, 再存入主内存中。
并发问题如下:如果多个线程同事操作同一数据, A线程从主内存中取的I的值为1, 然后进行加1操作, 这时B线程也取I的值, 进行加2操作, 然后A存入2到主内存中, B也存入, 这样就覆盖了A的值(同数据库中的并发问题一样)。
解决办法是用synchronize, 如用synchronized(I)。被synchronize 修饰的方法(块)把以下三步操作当成一个原子操作:取数据, 操作数据, 存数据。 我们知道原子操作是不可以被打断的, 所以其保证了数据一致性, 这样同一时间只有一个线程再执行, 对性能有一定的影响。这也是synchronize的第二个作用:保证统一时间只有一个线程再运行。 当实现SOCKET连接的时候经常用到.
JAVA中规定对非FLOAT, LONG的原始类型的取和存操作为原子操作。 其实就是对一个字(32位)的取,存位原始操作, 因为FLOAT, LONG为两个字节的长度, 所以其取, 存为非原子操作。 如果想把他们也变为原子操作, 可以用VOLATILE关键字来修饰
使用方法:
作用区域主要有两种:
1.方法
2.代码块
被synchronized声明的方法被称为同步方法,被其修饰的代码块称为同步语句。无论是同步方法还是同步语句,只要声明为同步了,在同一时刻,同一个对象的同步XX是不可以被同时访问的,而不同对象之间的同步方法是互不干扰的。
具体实现(如下代码都在某个类定义中):
同步方法:
Public synchronized void change() {
//
}
同步语句
相关文档:
1 SimpleDateFormat担当重任,怎样格式化都行
import java.util.Date;
import java.text.SimpleDateFormat;
public class Demo
{
public static void main(String[] args)
{
Date now=new Date();
SimpleDateFormat f=newSimpleDateFormat("今天是"+"yyyy年MM月dd日 E kk点mm分");
System.out.println(f.fo ......
8种基本数据类型有相应的8种包装类(Wrapper)对应,分别是:Character,Byte,Short,Integer,Long,Float,Double,Boolean.
特点:
1.提供了valueOf(String)用于从字符串转换及toString()转换成字符串
2.通过xxxxValue()方法可以得到所包装的值,如Integer对象的intValue()方法.
示例代码:
public class DoubleAndString {
pu ......
JAVA程序反编译工具
下载地址:http://java.decompiler.free.fr/?q=jdgui
JD-GUI
JD-GUI is a standalone graphical utility that displays Java source codes of “.class” files. You can browse the reconstructed source code with the JD-GUI for instant access to methods and fields.
JD-GUI is fre ......
Map map = new HashMap();
Iterator iter = map.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry) iter.next();
Object key = entry.getKey();
Object val = entry.getValue();
}
......
A:
设计模式之Factory(简单工厂模式、工厂方法和抽象工厂)
了解反射:
Class.forName().newInstance();
1.简单工厂方法
角色:
具体工厂
抽象产品
具体产品
比喻:
一个产业结构单一,只专门一个产品领域的小工厂,如软件。
2工厂方法
角色:
抽象工厂:不做具体的工作,完成生产产品所必须 ......