java多线程(五)synchronized关键字修饰代码块

原创 2015年08月26日 09:11:11

转载请注明出处:http://blog.csdn.net/xingjiarong/article/details/47916703
在上一篇博客中我们介绍了synchronized关键字修饰方法的用法,我们接着介绍synchronized关键字。除了修饰方法之外,还可以修饰代码块,一共有以下5种用法。

一、this

synchronizedthis){
    //互斥代码
}

这里的this指的是执行这段代码的对象,synchronized得到的锁就是this这个对象的锁,这种写法等价于我们上一篇博客中讨论的:

public synchronized void func(){
    //互斥代码
}

二、A.class

synchronized(A.class){
    //互斥代码
}

这里A.class得到的是A这类,所以synchronized关键字得到的锁是类的锁,这种方法同下面的方法功能是相同的:

public static synchronized void fun(){
    //互斥代码
}

所有需要类的锁的方法等不能同时执行,但是它和需要某个对象的锁的方法或者是不需要任何锁的方法可以同时执行。

三、object.getClass()

synchronized(object.getClass){
    //互斥代码
}

这种方法一般情况下同第二种是相同,但是出现继承和多态时,得到的结果却是不相同的。所以一般情况下推荐使用A.class的方式。

四、object

synchronized(object){
    //互斥代码
}

这里synchronized关键字拿到的锁是对象object的锁,所有需要这个对象的锁的方法都不能同时执行。

public class Trans {
private Object lock = new Object();

    public void printNum(int num){
        synchronized (lock) {
            System.out.print(Thread.currentThread());  
            for(int i=0;i<25;i++){  
                System.out.print(i+" ");  
            }  
            System.out.println();
        }          
    }


}
class MyThread implements Runnable {  
    private Trans trans;  
    private int num;  

    public MyThread(Trans trans, int num) {  
        this.trans = trans;  
        this.num = num;  
    }  

    public void run() {  
        while (true)  
        {  
            trans.printNum(num);  
            try {  
                Thread.sleep(500);  
            } catch (InterruptedException e) {  
                e.printStackTrace();  
            }  
        }  

    }  
}

public class Test {  


    public static void main(String[] args) {  

        Trans t = new Trans();  
        Trans t1 = new Trans();  
        Thread a = new Thread(new MyThread(t, 1));  
        Thread b = new Thread(new MyThread(t1, 2));  

        a.start();  
        b.start();  

    }  

}

在上边的例子中试图使用这种方法达到互斥方法打印方法,但是事实是这样做是没有效果的,因为每个Trans对象都有自己的Object对象,这两个对象都有自己的锁,所以两个线程需要的是不同锁,两个锁之间没有任何相互作用,所以不会起到互斥作用。

五、static object

上边的代码稍作修改就可以起到互斥作用,将Trans类中Object对象的声明改为下面这样:

private static Object lock = new Object();

这样不同的类使用的就是同一个object对象,需要的锁也是同一个锁,就可以达到互斥的效果了。

经过两篇博客的介绍,我们详细的讨论了synchronized关键字的用法,看似非常复杂,其实抓住要点之后还是很好区分的,只要看synchronized获得的是哪个对象或者类的锁就行啦,其他需要这个锁的方法都不能同时执行,不需要这个锁的方法都能同时执行。

最后还要告别一个误区,相信大家都不会再犯这种错误了,synchronized锁住的是一个对象或者类(其实也是对象),而不是方法或者代码段。

版权声明:本文为博主原创文章,转载请注明出处,查看原文章,请访问:http://blog.csdn.net/xingjiarong

java中的synchronized(同步代码块和同步方法的区别)

问题的由来: 看到这样一个面试题: //下列两个方法有什么区别 public synchronized void method1(){}public void method2(){ syn...
  • H_Gao
  • H_Gao
  • 2016年08月21日 13:48
  • 20552

java synchronized(同步代码块)

Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。     一、当两个并发线程访问同一个对象object中的这个synchronized...

Java线程同步:synchronized锁住的是代码还是对象

在Java中,synchronized关键字是用来控制线程同步的,就是在多线程的环境下,控制synchronized代码段不被多个线程同时执行。Synchronized既可以对代码块使用,也可以加在整...

JAVA 同步代码块synchronized

//仅作为学习笔记 /* JAVA对于多线程的安全问题提供了专业的解决方式 就是同步代码块 synchronized(对象)//这个对象可以为任意对象 { 需要被同步的代码 } 对象如同锁...

java中synchronized修饰代码块(两种创建线程的方式讲解卖票程序)

格式: synchronized(类对象名 aa) { //同步代码块 } 功能: synchronized(类对象名 aa)的含义是:判断aa是否已经被其他线程所霸占,如果发现已经被...
  • Rain722
  • Rain722
  • 2016年09月06日 15:03
  • 748

Java Synchronized修饰静态方法普通方法和代码块

Class A {     public synchronized methodA() {//对当前对象加锁     }     public  methodB() {            ...

一张图讲解对象锁和关键字synchronized修饰方法(代码块)

每个对象在出生的时候就有一把钥匙(监视器Monitor),那么被synchronized 修饰的方法相当于给方法加了一个锁,这个方法就可以进行同步,在多线程的时候,不会出现线程安全问题。 注:Moni...

Java多线程之synchronized及死锁编写

java中锁很常见,尤其是在多线程的情况下,我们会经常使用到锁。面试中我们也会经常被问到如何编写一个死锁。 java提供synchronized关键字来提供锁机制,在多线程中为了使程序并行我们会常使用...

Hbase创建表插入查询数据案例

package org.robby; import java.io.IOException; import java.text.DateFormat; import java.text.Simpl...

java多线程(五)synchronized关键字修饰代码块

先来为大家介绍一下java中锁的概念。java中的每个对象和每个类都有锁,而且是互斥锁,也就是说只能有一方占有,另一方只能等到对方释放后才能再占有锁。synchronized关键字就是基于java的对...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java多线程(五)synchronized关键字修饰代码块
举报原因:
原因补充:

(最多只允许输入30个字)