`
zengshaotao
  • 浏览: 791852 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

只在synchronized块里同步

 
阅读更多

package thread;

/**
 * 线程在执行同步方法时是具有排它性的。当任意一个线程进入到一个对象的任意一个同步方法时,
 * 这个对象的所有同步方法都被锁定了,在此期间,其他任何线程都不能访问这个对象的任意一个同步方法,
 * 直到这个线程执行完它所调用的同步方法,从中退出并释放该对象的同步锁之后。
 * 在一个对象被某个线程锁定之后,其他线程是可以访问这个对象的所有非同步方法的。
同步块是通过锁定一个指定的对象,来对同步块中包含的代码进行同步;
而同步方法是对这个方法块里的代码进行同步,这种情况下锁定的对象就是同步方法所属的主体对象自身。
如果一个对象既有同步方法,又有同步块,那么当其中任意一个同步方法或者同步块被某个线程执行时,
这个对象就被锁定了,其他线程无法在此时访问这个对象的同步方法,也不能执行同步块

如果这个方法是静态同步方法呢?
那么线程锁定的就不是这个类的对象了,也不是这个类自身,而是这个类对应的java.lang.Class类型的对象。
同步方法和同步块之间的相互制约只限于同一个对象之间,
所以静态同步方法只受它所属类的其它静态同步方法的制约,而跟这个类的实例(对象)没有关系。
 * @author zengst
 *
 */
public class NonSynchrTest {

 public static void main(String args[]) {
  //这里new了不同的对象,不存在线程冲突的问题
  

//注意,这里不是new多个对象,否则没有同步的意义(因为对象锁是对同一个对象而言的)
  NonSynChrThread nc1 = new NonSynChrThread("mb1");
  Thread t1 = new Thread(nc1);
  t1.start();
  try {
   Thread.sleep(1000);
  } catch (InterruptedException e) {
   e.printStackTrace();
  }
  Thread t2 = new Thread(nc1);
  t2.start();
  try {
   Thread.sleep(1000);
  } catch (InterruptedException e) {
   e.printStackTrace();
  }
  Thread t3 = new Thread(nc1);
  t3.start();
  
  
  
 }
}

class NonSynChrThread implements Runnable{
 
 public NonSynChrThread(String name){
 }
 public void run() {
  System.out.println(Thread.currentThread().getName()+":thread start ! ");
  print(10);
 }
 public synchronized void print(int n){
  try {
   for(int i=0;i< n ;i++){
    System.out.println(Thread.currentThread().getName()+":print:"+i);
    Thread.sleep(500);
   }
  } catch (InterruptedException e) {
   e.printStackTrace();
  }
  
  
 }
}

运行结果:

Thread-0:thread start !
Thread-0:print:0
Thread-0:print:1
Thread-0:print:2
Thread-1:thread start !  --这里说明在线程0执行同步块时依然有其他线程在非同步块外执行
Thread-0:print:3
Thread-0:print:4
Thread-2:thread start !
Thread-0:print:5
Thread-0:print:6
Thread-0:print:7
Thread-0:print:8
Thread-0:print:9
Thread-2:print:0
Thread-2:print:1
Thread-2:print:2
Thread-2:print:3
Thread-2:print:4
Thread-2:print:5
Thread-2:print:6
Thread-2:print:7
Thread-2:print:8
Thread-2:print:9
Thread-1:print:0
Thread-1:print:1
Thread-1:print:2
Thread-1:print:3
Thread-1:print:4
Thread-1:print:5
Thread-1:print:6
Thread-1:print:7
Thread-1:print:8
Thread-1:print:9

分享到:
评论

相关推荐

    java同步synchronized关键字用法示例

    - **代码块同步:** 也可以使用`synchronized`关键字来同步代码块,这样可以更细粒度地控制同步范围,提高程序性能。 ```java public void method() { synchronized (object) { // 代码块 } } ``` 这里的`object...

    同步代码块(synchronized).zip

    在Java编程语言中,同步代码块(synchronized blocks)是一种重要的多线程控制机制,用于保证线程安全,防止数据的不一致性。本压缩包包含了两个示例代码——Example12.java和Example13.java,它们是针对同步代码块...

    java多线程编程之使用Synchronized块同步方法

    在Java中,`synchronized`有两种使用方式:同步方法和同步代码块。 1. 同步方法: 同步方法是指在方法声明前加上`synchronized`关键字,它会锁定该方法所在的对象。对于非静态方法,锁的是当前对象实例;对于静态...

    详细解读java同步之synchronized解析

    Java中的`synchronized`关键字是实现多线程同步的重要机制,它确保了在并发环境中对共享资源的访问是线程安全的。以下是对`synchronized`的详细解读: ### 1. synchronized的特性 - **互斥性**:当一个线程进入一...

    java中synchronized(同步代码块和同步方法)详解及区别

    从性能角度考虑,同步代码块通常优于同步方法,因为它们只锁住必要的代码区域,而不是整个方法。这减少了死锁和资源竞争的可能性,提高了程序的并发性能。然而,选择同步代码块还是同步方法取决于实际需求,如果需要...

    25.线程的同步机制-synchronized同步语句-使用同步代码块解决同步方法的弊端.mp4

    在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。

    30.线程的同步机制-synchronized同步语句-静态同步synchronized方法与synchronized(class)代码块.mp4

    在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。

    27.线程的同步机制-synchronized同步语句-synchronized代码块间的同步性.mp4

    在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。

    synchronized用法大全实例

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

    正确使用多线程同步锁@synchronized()1

    `@synchronized`关键字是Apple提供的一种简便的同步机制,它可以帮助开发者确保在多线程环境下对共享资源进行原子性操作,防止数据竞争问题。本文将深入探讨`@synchronized`的工作原理、特点以及使用时需要注意的...

    Java 同步锁(synchronized)详解及实例

    因此,在设计多线程程序时,应尽可能减少同步的范围,只对那些确实需要保护的代码进行同步。 除此之外,Java 5引入了更高级的并发工具类,如`java.util.concurrent.locks`包下的`ReentrantLock`,它提供了可中断和...

    java多线程编程之Synchronized块同步方法

    本篇文章将深入探讨`synchronized`块同步方法及其应用,通过实例来阐述其工作原理。 首先,我们来看一个基本的例子。在上述代码中,`Example`类有一个`synchronized`修饰的`excute()`方法。这意味着当一个线程正在...

    Android synchronized 测试案例

    在Android开发中,`synchronized`关键字是Java语言中用于实现线程同步的重要工具,它在多线程环境下确保了共享资源的安全访问。本测试案例深入探讨了`synchronized`的使用方法,包括同步单个对象、同步多个对象以及...

    java里面synchronized用法.doc

    在上面的例子中,synchronized 关键字被用于代码块中,以实现对当前对象的互斥访问控制。 三、synchronized 关键字的继承 synchronized 关键字不能被继承,即基类的 synchronized 方法在继承类中不自动变成 ...

    java锁机制Synchronizedjava锁机制Synchronized

    Synchronized 代码块是 Java 中的一种同步机制,它可以指定获取某个对象的钥匙,然后在该对象上的某个代码块中执行同步操作。Synchronized 代码块可以指定用哪一把钥匙才能开这个屏风的锁,可以用本房的钥匙,也可以...

    java中synchronized用法

    当 synchronized 关键字加在方法上时,它锁定的是调用这个同步方法的对象。例如,在以下代码中: public synchronized void methodAAA(){ //…. } 这个方法是同步方法,它锁定的是调用这个方法的对象,如 P1。当...

    java的线程同步机制synchronized关键字的理解_.docx

    除了方法前用 synchronized 关键字,synchronized 关键字还可以用于方法中的某个区块中,表示只对这个区块的资源实行互斥访问。用法是:synchronized(this){/*区块*/},它的作用域是当前对象。 synchronized 的使用...

    java_synchronized详解

    通过在方法或代码块上使用`synchronized`,可以确保同一时间只有一个线程能访问这些代码区域,从而有效避免了多线程环境下的数据竞争和不一致性问题。 #### 二、synchronized的作用机制 `synchronized`主要通过对象...

    synchronized详解

    避免不必要的同步控制,只在绝对必要的地方使用。 为了更好地利用`synchronized`,需要考虑以下几点: - **锁定粒度**:尽可能减小同步的范围,只同步必要的代码,避免过多的同步导致性能下降。 - **死锁预防**:...

Global site tag (gtag.js) - Google Analytics