论坛首页 Java企业应用论坛

同步心得

浏览 3326 次
锁定老帖子 主题:同步心得
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (9)
作者 正文
   发表时间:2012-06-22   最后修改:2012-07-09

做多线程有段时间了,回首看自己原来的代码,很是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;
		}
	}

}

 

希望能够得到跟多批评 


   发表时间:2012-06-23  
第一条有错吧?什么叫"想用这个对象的什么都不成了",如果是对象非同步方法还是可以调用的呀
0 请登录后投票
   发表时间:2012-06-24  
感觉,楼主应该还是没有明白什么叫做锁,呵呵
0 请登录后投票
   发表时间:2012-06-25  
额,楼主需要先了解对象内部锁.
0 请登录后投票
   发表时间:2012-07-09  
finallygo 写道
第一条有错吧?什么叫"想用这个对象的什么都不成了",如果是对象非同步方法还是可以调用的呀

多谢更正,已经认识到错误了,希望能给更多意见
0 请登录后投票
   发表时间:2012-07-09  
skydream 写道
感觉,楼主应该还是没有明白什么叫做锁,呵呵

呵呵,我是入门小白,已经更正了,希望能给更多意见
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics