Summary of keyword synchronized

原创 2007年09月15日 23:03:00

1:  synchronized 可以同步方法(包括静态方法),也可以同步语句,甚至变量(对象引用,实例变量)

2:每个对象都有且只有一个锁,无论synchronized是针对对象还是方法,它取得的都是锁对象,并且锁对象(即同步方法或同步变量)可能被其它线程的对象访问,这是十分危险的,在设计多线程程序时应注意synchronized的使用,下面通过一个示例简要说明锁对象使用不当而被其它线程访问后引起的混乱。

public class ThreadDemo extends Thread{

      int sum = 0;

      public void run(){
         
           for(int i = 0; i < 10; i ++){
                  showMessage();
                  System.out.print(System.currentTimeMillis() + "/n");
                 
           }     
          }
         
    synchronized  void showMessage(){
      try{
        Thread.sleep(1000);
      }
      catch(InterruptedException e){
          e.printStackTrace();
      }
        sum += 1;
        System.out.print(getName() + " : "+ sum + "   ");
        //............................

    }

   public static void main(String[] args){

            Thread ob1 = new ThreadDemo()
            Thread ob2 = new ThreadDemo();
            ob1.start();
            ob2.start();

   }

}

运行结果如下:

Thread-0 : 1   1189866544054
Thread-1 : 1   1189866544054
Thread-0 : 2   1189866545056
Thread-1 : 2   1189866545056
Thread-0 : 3   1189866546057
Thread-1 : 3   1189866546057
Thread-0 : 4   1189866547058
Thread-1 : 4   1189866547058
Thread-0 : 5   1189866548060
Thread-1 : 5   1189866548060
Thread-0 : 6   1189866549061
Thread-1 : 6   1189866549061
Thread-0 : 7   1189866550063
Thread-1 : 7   1189866550063
Thread-0 : 8   1189866551064
Thread-1 : 8   1189866551064
Thread-0 : 9   1189866552066
Thread-1 : 9   1189866552066
Thread-0 : 10   1189866553067
Thread-1 : 10   1189866553067

从上述运行结果来看,synchronized并未起作用,当前线程的同步方法被另一个线程进入了,这是因为锁是针对对象的,锁是对象级的,在程序中,有两个对象ob1,ob2,  ob1的同步方法可以被ob2调用,因为这两对象之间没有互斥,只有ob1在不同的线程间执行同步方法,才能形成互斥。上面的程序可以声明sum为static类型(参考文章java 关键字volatile ),正确的运行结果如下:

Thread-0 : 1   1189867573655
Thread-1 : 2   1189867573655
Thread-0 : 3   1189867574656
Thread-1 : 4   1189867574656
Thread-0 : 5   1189867575647
Thread-1 : 6   1189867575657
Thread-0 : 7   1189867576649
Thread-1 : 8   1189867576649
Thread-0 : 9   1189867577650
Thread-1 : 10   1189867577650
Thread-0 : 11   1189867578852
Thread-1 : 12   1189867578862
Thread-0 : 13   1189867579854
Thread-1 : 14   1189867579854
Thread-0 : 15   1189867580855
Thread-1 : 16   1189867580855
Thread-0 : 17   1189867581856
Thread-1 : 18   1189867581856

3:在避免2中所示的混乱后,synchronized可以对象

public void showMessage(){
     synchronized(simpleObj){
     ...........................
      }
}
锁就是simpleObj这个对象,可以使用一个简单的类型来代表这个锁,比如simpleObj = new String("")

3: 同步static方法

class staticDemo{
public static synchronized void a(){

}
public void b(){
   synchronized(staticDemo.class){

   }
}

}

在上述情况下,一个对象的多线程分别访问a()和b()两个方法时,是不会形成互斥的,因为它们不是同一个对象锁,a是obj对象,b是obj所属的那个class.

4:在线程间通信的有两个重要的方法wait()和notify(), 这两个方法一定要在synchronized块中,否则程序会throw “IllegalMonitorStateException”,但有synchronized的地方不一定有这两个方法。

5: 重要提示:在设计多线程程序的过程中,一定要首先明确synchronized锁定的确切对象。

如何写一篇英文文章的Summary?

摘要是对一篇文章的主题思想的简单陈述。它用最简洁的语言概括了原文的主题。写摘要主要包括三个步骤:(1)阅读;(2)写作;(3)修改成文。        第一步:阅读 A.认真阅读给定的原文...
  • Algorithmguy
  • Algorithmguy
  • 2014年09月28日 08:25
  • 3539

jmeter summary report 字段意思和设置集合点解释

1.需要在添加一个名为summary report的监听器,跑完之后查看 Label:取样器/监听器名称 Samples :事务数量 Average:平均一个完成一个事务消耗的时间(平均响应时间) M...
  • j379832526
  • j379832526
  • 2017年06月23日 16:57
  • 1447

c# 利用注释summary生成文档

c# 利用注释summary生成文档
  • huwei2003
  • huwei2003
  • 2017年02月05日 18:21
  • 3064

java并发学习:synchronized 的不足之处

程老师原文地址:http://flychao88.iteye.com/blog/1852893 原文如下: 1、不能够跨越多个对象。  2、当在等待锁对象的时候,不能中途放弃,直到成功。  ...
  • bohu83
  • bohu83
  • 2016年04月11日 18:23
  • 684

java中几种synchronized用法总结

文章为自己测试后所写,有说得不对的地方希望看到的大神能够指出来让我得以改正,以免误导其他同行 synchronized方法,synchronized静态方法,synchronized(this),sy...
  • apeng_1102
  • apeng_1102
  • 2016年09月28日 09:31
  • 474

对synchronized(this)的一些理解

一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。...
  • tjcyjd
  • tjcyjd
  • 2014年03月20日 11:00
  • 5251

java的两种同步方式, Synchronized与ReentrantLock的区别

java在编写多线程程序时,为了保证线程安全,需要同步,经常用到两种同步方式就是Synchronized和重入锁ReentrantLock。 相似点: 这两种同步方式有很多相似之处,它们都是加锁方式同...
  • chenchaofuck1
  • chenchaofuck1
  • 2016年04月02日 19:37
  • 6962

R语言中描述统计量的多种方法summary()、describe()、str()等

1. summary()函数可以获取描述性统计量 可以提供最小值、最大值、四分位数和数值型变量的均值,以及因子向量和逻辑型向量的频数统计 2. misc包中的describe()函数 可返回变量和观测...
  • Ssxysxy123
  • Ssxysxy123
  • 2016年07月11日 10:57
  • 20216

Lock为什么比synchronized 能更好的实现同步访问

synchronized是java中的一个关键字,也就是说是Java语言内置的特性。那么为什么会出现Lock呢?   如果一个代码块被synchronized修饰了,当一个线程获取了对应的锁,并执行...
  • zhengchao1991
  • zhengchao1991
  • 2016年10月10日 14:36
  • 864

synchronized是什么方法?干什么用的?

 synchronized 关键字,它包括两种用法:synchronized 方法和 synchronized 块。 1. synchronized 方法:通过在方法声明中加入 synchro...
  • qw222pzx
  • qw222pzx
  • 2016年09月22日 10:29
  • 911
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Summary of keyword synchronized
举报原因:
原因补充:

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