zoukankan      html  css  js  c++  java
  • *圣思园java se培训总结(102-)(synchronized相关)

    1. synchronized只能修饰方法,和修饰一个代码块!
    2. //修饰一个块
      syschronized(一个对象) { 。。。。 }
      java中的每一个对象都有一个锁(lock),或者叫监视器,当这个对象访问一个synchronized方法的时候,表示将这个对象上锁,此时其它任何线程都无法再去访问这个synchronized方法了!直到之前那个线程执行完毕方法后或者抛出异常,那么将该对象的锁释放掉,其它线程就可以访问该synchronized方法。
    3. 如果一个对象有多个synchronized方法,在某一时刻,一个线程进入到某个synchronized方法后,那么在这个方法没有执行完毕前,其它线程是无法访问该对象的任何synchronized方法!
    4. 如果有多个对象多个线程访问一个synchronized方法,这样情况下,多个线程都会随机的去访问该方法,只会锁住对应的对象。
    5. //如果有多个对象多个线程访问一个static synchronized的方法,则此方法每次只允许一个对象调用
    6. 如果某个syschronized方法是static的,那么当多个线程访问这个方法的时候,它锁的不是synchronized方法所在的的对象,而是锁的是所在对象对应的Class对象,因为java中无论有多少个对象,这些对象会对应一个Class对象,因此当线程分别访问同一个类的多个对象的static synchronized方法时,他们的执行顺序也是顺序的,也就是说一个线程先去执行方法,执行完毕后,另一个线程才开始执行。
    7. 下面的代码,请根据上面的规则自己修改,然后测试
    package com.yuxi.lesson102;
    
    public class SynchronizedDemo
    {
    	public static void main(String[] args)
    	{
    		Event event = new Event();
    		Event event2 = new Event();
    		MyThread1 myThread = new MyThread1(event);
    		MyThread2 myThread2 = new MyThread2(event2);
    		new Thread(myThread).start();
    		new Thread(myThread2).start();
    		Event.doThingOne();
    	}
    
    }
    
    class Event
    {
    	public static synchronized void doThingOne()
    	{
    		for (int i = 0; i <20; i++)
    		{
    			try
    			{
    				Thread.sleep((long) (Math.random()*100));
    			}
    			catch (InterruptedException e)
    			{
    				e.printStackTrace();
    			}
    			System.out.println("事情1正在做"+i);
    		}
    		System.out.println("做完了事情1");
    	}
    	public synchronized void doThingTwo()
    	{
    		for (int i = 0; i <20; i++)
    		{
    			try
    			{
    				Thread.sleep((long) (Math.random()*100));
    			}
    			catch (InterruptedException e)
    			{
    				e.printStackTrace();
    			}
    			System.out.println("事情2正在做"+i);
    		}
    		System.out.println("做完了事情2");
    	}
    }
    
    class MyThread1 implements Runnable
    {
    	private Event event;
    	public MyThread1(Event event)
    	{
    		this.event = event;
    	}
    	@Override
    	public void run()
    	{
    		this.event.doThingOne();
    	}
    	
    }
    class MyThread2 implements Runnable
    {
    	private Event event;
    	public MyThread2(Event event)
    	{
    		this.event = event;
    	}
    	@Override
    	public void run()
    	{
    		this.event.doThingOne();
    	}
    	
    }
    
  • 相关阅读:
    【转】Wrapper配置详解及高级应用
    【转】Eclipse4.4.1安装velocity插件Veloeclipse.ui_2.0.8
    【转】创建SVN仓库的步骤
    【转】Hibernate 常见异常
    [转]Java中Map的用法详解
    [转]CocoaPods安装和使用教程
    [转]struts1.2的action参数配置
    [转]hibernateTools工具安装及使用总结(eclipse 3.6)
    [转]iOS开发中@property的属性weak nonatomic strong readonly等介绍
    [转]使用 Xcode 5 和 Interface Builder创建 Hello World App
  • 原文地址:https://www.cnblogs.com/yuxishua/p/5104492.html
Copyright © 2011-2022 走看看