`

对synchronized的一点认识

阅读更多
今天看了一下多线程。
对synchronized这个东东是研究了一上午啊!
首先做一下总结:
对synchronized的使用主要在两方面 
1,synchronized method()。线程安全,
2,synchronized(object )。“同步控制块”,不过我更喜欢“临界区”这个叫法。(操作系统里是这样写的,呵呵)!

synchronized method()。这个嘛,不用说是对类中的方法的锁定,在方法未执行完,但执有该方法线程时间片已到时,锁定该方法,其它线程将不能访问该方法,直到执有此方法的线程释放该方法,其它线程才能访问此方法。

synchronized(object )则从名字上可看出来是对对象的锁定。是对一个资源的锁定。也即:当一个线程在使用一个对象资源时,其它线程等待,或者说处于阻塞状态,只有该线程释放对(object)的锁定时,才再一次激活。
下面是我自己的测试例子:
java 代码
 
  1. package synchronizedTest;  
  2.   
  3. public class Student {  
  4.   
  5.     private int age;  
  6.   
  7.     public int getAge() {  
  8.         return age;  
  9.     }  
  10.   
  11.     public void setAge(int age) {  
  12.         this.age = age;  
  13.     }  
  14.       
  15.     public  void test(int age){  
  16.         try {         
  17.             this.setAge(age);  
  18.             System.out.println(Thread.currentThread().getName()+" Setage:"+age);  
  19.             Thread.sleep(500);  
  20.             System.out.println(Thread.currentThread().getName()+" Getage:"+this.getAge());  
  21.         } catch (InterruptedException e) {        
  22.             e.printStackTrace();  
  23.         }         
  24.     }     
  25. }  

java 代码
 
  1. package synchronizedTest;  
  2.   
  3. import java.util.Random;  
  4.   
  5. public class Test extends Thread {  
  6.   
  7.     private Student student;  
  8.     public Test(){  
  9.         this.student=new Student();  
  10.     }  
  11.       
  12.     public Test(Student student){  
  13.         this.student=student;  
  14.     }  
  15.       
  16.     public void run(){  
  17.         System.out.println(this.getName()+" start...");  
  18.         for(int i=0;i<5;i++){  
  19.             Random ran=new Random();  
  20.             int age=ran.nextInt(60);  
  21.             student.test(age);  
  22.         }  
  23.         System.out.println(this.getName()+" end...");  
  24.     }  
  25. }  
java 代码
 
  1. package synchronizedTest;  
  2.   
  3. public class Demo {  
  4.   
  5.     /** 
  6.      * @param args 
  7.      */  
  8.     public static void main(String[] args) {  
  9.         // TODO Auto-generated method stub  
  10.         Student student=new Student();  
  11.         Test t1=new Test(student);  
  12.         Test t2=new Test(student);  
  13.         t1.setName("A");  
  14.         t2.setName("B");  
  15.         t1.start();  
  16.         t2.start();  
  17.     }  
  18.   
  19. }  

结果如下:
A start...
A Setage:23
B start...
B Setage:53
A Getage:53
A Setage:56
B Getage:56
B Setage:52
A Getage:52
A Setage:2
B Getage:2
B Setage:19
A Getage:19
A Setage:47
B Getage:47
B Setage:2
A Getage:2
A Setage:19
B Getage:19
B Setage:3
B Getage:3
B end...
A Getage:3
A end...
明显上面的例子中发了资源冲突,下面我们对Student类的Test方法加一个线程同步(synchronized):
java 代码
 
  1. public synchronized void test(int age){  
  2.         try {         
  3.             this.setAge(age);  
  4.             System.out.println(Thread.currentThread().getName()+" Setage:"+age);  
  5.             Thread.sleep(500);  
  6.             System.out.println(Thread.currentThread().getName()+" Getage:"+this.getAge());  
  7.         } catch (InterruptedException e) {        
  8.             e.printStackTrace();  
  9.         }         
  10.     }     

结果如下:
A start...
A Setage:46
B start...
A Getage:46
B Setage:48
B Getage:48
A Setage:56
A Getage:56
B Setage:47
B Getage:47
A Setage:5
A Getage:5
B Setage:2
B Getage:2
A Setage:58
A Getage:58
B Setage:59
B Getage:59
A Setage:0
A Getage:0
A end...
B Setage:17
B Getage:17
B end...
看到我们想要结果了!

我们再继续讨论    synchronized(object)依然用上面的Student类;
java 代码
 
  1. import java.util.Random;  
  2.   
  3. public class StudentThread extends Thread {  
  4.   
  5.     private Student student;  
  6.       
  7.     public StudentThread(Student student){  
  8.         this.student=student;     
  9.     }  
  10.     public  StudentThread(){  
  11.         this.student=new Student();       
  12.     }  
  13.       
  14.     public void setStudentAge(int age){  
  15.         this.student.setAge(age);  
  16.         System.out.println(this.getName()+" set Studnet age:"+this.student.getAge());  
  17.     }  
  18.       
  19.     public void printAge(){  
  20.         System.out.println(this.getName()+" get Student age:"+this.student.getAge());  
  21.     }  
  22.       
  23.       
  24.      public void  run(){  
  25.         System.out.println(this.getName()+" start...");  
  26.          test();  
  27.     }  
  28.        
  29.      public synchronized void test(){  
  30.          try{  
  31.                 for(int i=0;i<5;i++){  
  32.           
  33.                     Random ran=new Random();  
  34.                     int age=ran.nextInt(50);  
  35.                     synchronized(student){  
  36.                         this.setStudentAge(age);  
  37.                         this.sleep(500);  
  38.                         this.printAge();                  
  39.                     }  
  40.                 }  
  41.             }  
  42.             catch(Exception e){  
  43.                 e.printStackTrace();  
  44.             }  
  45.      }  
  46. }  
java 代码
 
  1. public class ThreadDemo {  
  2.   
  3.     /** 
  4.      * @param args 
  5.      */  
  6.     public static void main(String[] args) {  
  7.         // TODO Auto-generated method stub  
  8.         Student student=new Student();  
  9.       
  10.         StudentThread thread1=new StudentThread(student);  
  11.         StudentThread thread2=new StudentThread(student);  
  12.           
  13.   
  14.         thread1.setName("a");  
  15.         thread2.setName("b");  
  16.           
  17.         thread1.start();          
  18.         thread2.start();  
  19.     }  
  20. }  
我们再看看结果:
a start...
a set Studnet age:13
b start...
a get Student age:13
b set Studnet age:7
b get Student age:7
a set Studnet age:11
a get Student age:11
b set Studnet age:22
b get Student age:22
a set Studnet age:43
a get Student age:43
b set Studnet age:49
b get Student age:49
a set Studnet age:49
a get Student age:49
b set Studnet age:46
b get Student age:46
a set Studnet age:36
a get Student age:36
b set Studnet age:1
b get Student age:1
分享到:
评论
2 楼 dennis_zane 2007-11-30  
怎么回复了,还删不了?路过,路过,不好意思
1 楼 heshencao 2007-11-30  
呵呵,JAVA新人。初次发贴!

相关推荐

    java里面synchronized用法.doc

    本文将对 Java 中的 synchronized 用法进行详细的解释和分析。 一、synchronized 关键字的作用域 synchronized 关键字可以被用于两种范围内:对象实例和类范围。 1. 对象实例范围:synchronized 关键字可以被用于...

    java中synchronized用法

    "Java 中 synchronized 用法详解" Synchronized 是 Java 语言中用于解决多线程共享数据同步问题的关键字。它可以作为函数的修饰符,也可以作为函数内的语句,用于实现同步方法和同步语句块。在 Java 中,...

    Android synchronized 测试案例

    `synchronized`关键字可以修饰方法或用作代码块,其主要作用是控制对共享资源的并发访问,防止数据不一致和竞态条件。当一个线程进入`synchronized`代码块或方法时,其他试图进入同一块的线程将被阻塞,直到持有锁的...

    volatile和synchronized的区别

    ### volatile与synchronized的区别 #### 一、锁的特性:互斥与可见性 在并发编程中,锁作为实现线程安全的一种手段,其核心作用在于提供两种特性:互斥和可见性。 - **互斥**:互斥是指在任何时刻,只允许一个...

    Java synchronized使用案例

    2. **内存可见性**:确保线程在读取或修改共享变量时,能看到其他线程对变量的最新修改,避免数据不一致。 3. **有序性**:防止指令重排序,保证代码执行的顺序性。 三、`synchronized`的特性与局限 1. **可重入性*...

    synchronized的几种示例

    在Java编程语言中,`synchronized`关键字是一个重要的并发控制机制,用于确保多线程环境下的数据一致性。本文将深入探讨`synchronized`的几种使用示例,包括方法加锁、代码块加锁(针对`this`和对象)以及静态方法...

    synchronized并发讲解源码.zip

    在Java编程语言中,`synchronized`关键字是一个非常重要的并发控制机制,用于保证多线程环境下的数据一致性。本文将深入解析`synchronized`的工作原理、使用方式以及它在并发编程中的重要性。通过分析提供的源码,...

    java锁机制Synchronizedjava锁机制Synchronized

    "Java 锁机制 Synchronized" Java 锁机制 Synchronized 是 Java 语言中的一种同步机制,用于解决多线程并发访问共享资源时可能出现的一些问题。 Java 锁机制 Synchronized 的概念 在 Java 中,每个对象都可以被...

    synchronized用法大全实例

    在Java多线程编程中,`synchronized`关键字是一个至关重要的工具,用于实现线程间的同步,以确保共享资源的安全访问。本实例大全将全面解析`synchronized`的使用方式,包括同步方法、同步语句块、类锁和对象锁。 ##...

    Synchronized关键字的用法

    `synchronized`关键字是Java中实现线程安全的基础工具之一,通过对共享资源进行加锁来确保数据一致性。开发者需要根据具体的应用场景选择合适的同步策略,同时注意性能优化,以达到最佳的效果。

    synchronized关键字的实质及用法

    通过`synchronized`,我们可以控制对共享资源的访问,避免并发问题,如数据竞争和死锁。本文将详细探讨`synchronized`的关键特性、用法以及它在实际开发中的应用。 1. **synchronized的两种使用方式** - **方法...

    JAVA synchronized详解

    ### JAVA synchronized详解 在Java编程语言中,`synchronized`是一个非常重要的关键字,它主要用于实现同步控制机制。通过使用`synchronized`,可以确保同一时刻只有一个线程能够访问被标记为同步的方法或代码块,...

    synchronized关键字的用法详解

    通过`synchronized`关键字,开发人员可以在多线程环境中有效地控制对共享资源的访问,避免出现数据不一致的情况。 #### 二、synchronized的基本用法 `synchronized`关键字有两种主要的使用方式:一种是在方法声明...

    synchronized详解

    - **避免锁竞争**:尽量减少多个线程对同一资源的并发访问,可以通过使用并发集合类如`ConcurrentHashMap`、`CopyOnWriteArrayList`等减少锁竞争。 了解这些原则和用法,可以帮助你更有效地使用`synchronized`...

    java同步synchronized关键字用法示例

    Java中的`synchronized`关键字是多线程编程中的一个重要概念,用于控制并发访问共享资源时的同步机制。在Java中,当多个线程试图同时访问和修改同一块代码或数据时,可能会导致数据不一致的问题。为了解决这个问题,...

    java_synchronized详解

    ### Java synchronized 关键字详解 #### 一、synchronized关键字简介 `synchronized`是Java语言提供的关键字之一,用于实现线程间的同步控制。通过在方法或代码块上使用`synchronized`,可以确保同一时间只有一个...

    Java synchronized详细解读.docx

    Java中的`synchronized`关键字是多线程编程中用于同步控制的关键元素,它的主要目标是解决并发环境下多个线程对共享资源的访问冲突。在Java中,由于线程共享内存空间,如果没有适当的同步机制,可能会导致数据不一致...

    java synchronized详解

    - **静态方法同步**:静态方法的同步是针对类级别的,这意味着所有线程都将被阻止,直到当前线程完成对静态方法的执行。 3. **`synchronized`在代码块上的应用** `synchronized`也可以应用于代码块,其语法是`...

    [JAVA][synchronized的使用]

    `synchronized`关键字在Java中提供了互斥访问,也就是说,当一个线程进入一个对象的`synchronized`代码块或方法时,其他线程对这个对象的`synchronized`代码块或方法的访问将会被阻塞,直到当前线程执行完毕并释放...

    java synchronized 学习

    非线程安全指多个线程同时对同一个对象的同一个实例变量进行读改操作,改变现有的值,此时会产生数据的脏读,导致数据不同步的情况,进而影响了程序的执行流程。 六、synchronized 同步锁概念及使用方法 ...

Global site tag (gtag.js) - Google Analytics