时间还过的真快呀,转眼就过了一年了。接触JAVA也快二年了,当初写BLOG的初衷也忘记了。今天突然想起,写下一篇吧。
多线程是服务端程序用的最多的技术,为了让多线程有序的访问共同资源,就必须在访问先查询资源是否可以访问,因此就产生了互斥。JAVA的互斥使用synchronized关键字来实现的,在使用上有二种方法,下面给出例子。
1.声明变量或函数在同一对象内可进行互斥
class TestClass
{
public byte[] m_Test = new byte[1];
public synchronized void Test()
{
//函数中的代码在互斥效果内
}
public void Test1()
{
synchronized(m_Test)
{
//段中的代码在互斥效果内
}
}
}
TestClass t = new TestClass();
所有的线程在使用t对象时,对t内的synchronized(m_Test)块和Test函数访问产生互斥作用。
2.声明变量或函数在同一个进程内可进行互斥
class TestClass
{
public static byte[] m_Test = new byte[1];
public static synchronized void Test()
{
//函数中的代码在互斥效果内
}
public void Test1()
{
synchronized(m_Test)
{
//段中的代码在互斥效果内
}
}
}
TestClass t = new TestClass();
TestClass t1 = new TestClass();
所有的线程在使用t和t1对象时,对synchronized(m_Test)块和Test函数访问均产生互斥作用,同时只存在一个线程访问。
仔细看一下,方法2比方法1,就是在声明的时候将变量或函数声明成静态的,除此以外并无差别。但是功能却天差地远。