做多线程有段时间了,回首看自己原来的代码,很是sb,故在此做出点sb的总结
首先讨论下synchronized,也就是java的内部锁,这也是最常用的同步
个人理解,如有雷同,纯属倒霉。
。。。。。。
多谢各位批评,之前的观点的确有很大问题;为了避免误人子弟,我已经把之前的三点观点删除了,那么重新来整理一下java的synchronized。
首先从synchronized方法说起,在一个类中的所有synchronized方法都是共用的一把锁;例如当一个对象在一个进程中进入了同步方法,获得了对象锁(本人称其为对象锁,非专业名词),那么在其他进程中这个对象就进不了同步方法,直到第一个进程释放对象锁,但是可以访问其他的非同步方法,和public属性。
那么说一下本人误解最大的synchronized(this),这个只是同步块的一种写法,其实也是用的上边的那把锁-对象锁。当一个进程进入synchronized(this)块,其他的进程就无法进入synchronized(this)块,以及synchronized方法。
那个synchronized(object)同步块,object当然不止可以是this,可以是任何对象(非空对象),一般锁的是同步块所使用的资源。
同步块,还有一种写法是synchronized(object.class),这样是锁object这个类,那么这样只允许object的一个对象的一个进程获得这个类锁
下面贴出个demo,是synchronized(this)的测试,代码很简单,就不做什么解释了
public class CollectionSynchronize
{
public static void main(String[] args)
{
CollectionSynchronize co = new CollectionSynchronize();
final SynchThis synthis = co.new SynchThis();
ExecutorService exec = Executors.newFixedThreadPool(100);
Runnable a = new Runnable()
{
@Override
public void run()
{
// TODO Auto-generated method stub
synthis.aa();
}
};
Runnable b = new Runnable()
{
@Override
public void run()
{
// TODO Auto-generated method stub
synthis.bb();
}
};
Runnable c = new Runnable()
{
@Override
public void run()
{
// TODO Auto-generated method stub
try
{
Thread.sleep(100);
}
catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
synthis.b = 10000;
System.out.println(synthis.getb());
}
};
exec.submit(a);
exec.submit(b);
exec.submit(c);
exec.shutdown();
}
class SynchThis
{
public void aa()
{
synchronized (this)
{
System.out.println("获取this锁");
try
{
Thread.sleep(1000);
}
catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("解锁this锁");
}
}
public synchronized void bb()
{
try
{
Thread.sleep(500);
}
catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("run work");
}
public int b = 10;
public int getb()
{
return b;
}
}
}
希望能够得到跟多批评