• java并发编程--Synchronized的理解


    synchronized实现锁的基础:Java中每一个对象都可以作为锁,具体表现为3种形式。

    (1)普通同步方法,锁是当前实例对象

    (2)静态同步方法,锁是当前类的Class对象

    (3)同步方法块,锁是Synchronized括号里配置的对象

    首先看一下普通同步方法。

    class Sync{
    	public synchronized void test(String threadname){
    		System.out.println(threadname+"开始");
    		try {
    			Thread.sleep(1000);
    		} catch (InterruptedException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		System.out.println(threadname+"结束");
    	}
    }
    class MyThread extends Thread{
    	public int i;
    	public MyThread(int i){
    		this.i=i;
    	}
    	public void run(){		
    		Sync sync=new Sync();
    		sync.test("Thread"+i);
    	}
    }
    public class SynTest {
        public static void main(String args[]){
        	for(int i=0;i<3;i++){
    			Thread thread=new MyThread(i);
    			thread.start();
    		}
        }
    }
    

    运行结果。

    Thread2开始
    Thread0开始
    Thread1开始
    Thread2结束
    Thread0结束
    Thread1结束  

    虽然test()加了synchronized关键字,但是并没与起作用。这是因为,实例化了3个thread,synchronized加锁的是这3个实例化对象,并不是test()中的代码。需要注意的是,其他线程必须等到该线程释放实例对象之后才能使用该实例化对象。

    然后看一下静态同步方法。修改上面的代码。将test()修改为静态的 

    public static synchronized void test(String threadname)
    

     运行结果

    Thread1开始
    Thread1结束
    Thread0开始
    Thread0结束
    Thread2开始
    Thread2结束
    

     这次synchronized关键字起作用了。这是因为静态同步方法的锁是当前类的Class对象,即Sync类的Class对象。当Thread1获取到该对象执行test()方法,Thread0只有等待Class对象释放之后才能使用。 

     最后是同步方法块,锁是取决于括号里的配置对象的。

     

    public void test(String threadname){
    		synchronized(this){
    		System.out.println(threadname+"开始");
    		try {
    			Thread.sleep(1000);
    		} catch (InterruptedException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		System.out.println(threadname+"结束");
    	}
    }
    

     当使用的锁是this,因为我们是为每个线程新建了Sync类,所以它们是3个不同的this。结果如下

    Thread0开始
    Thread2开始
    Thread1开始
    Thread0结束
    Thread1结束
    Thread2结束
    

     当使用Sync.Class对象作为锁时,synchronized的作用就看出来了。同一时刻只能有一个线程执行该段代码。

    Thread0开始
    Thread0结束
    Thread1开始
    Thread1结束
    Thread2开始
    Thread2结束
    

     使用当前类的Class对象作为锁,就相当于对某段代码加了锁。

     正在看并发~随手记下来~~参考的This http://blog.csdn.net/xiao__gui/article/details/8188833

  • 相关阅读:
    c网购物车流程图
    NPOI导Excel样式设置
    一个小时快速搭建微信小程序
    ajax实现过程
    JavaWeb结构
    VS常用快捷键
    MVC+三层架构
    JavaScript跨域总结与解决办法[转]
    HTML5是什么?如何鉴定HTML5产品?[转]
    黑盒测试与白盒测试原理
  • 原文地址:https://www.cnblogs.com/bydream/p/7111400.html
Copyright © 2020-2023  润新知