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
相关推荐
synchronized块来同步一个对象变量,也可以使用synchronized块来同步类中的静态方法和非静态方法,下面使用Synchronized块同步方法
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
【Java基础知识 第四节 多线程复习】中,同步代码块(synchronized关键字)的两个练习代码。
主要介绍了 java中synchronized(同步代码块和同步方法)详解及区别的相关资料,需要的朋友可以参考下
主要介绍了java多线程编程之Synchronized块同步方法,synchronized关键字又称同步锁,当方法执行完后,会自动释放锁锁,只有一个线程能进入此方法,看看下文中各种例子对synchronized的详细解释
java多线程编程核心技术synchronized实例大全,同步方法,同步语句块,类锁,对象锁全都用代码来展现出来
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
我们可以通过synchronized块来同步特定的静态或非静态方法。要想实现这种需求必须为这些特性的方法定义一个类变量,然后将这些方法的代码用synchronized块括起来,并将这个类变量作为参数传入synchronized块
synchronized关键字可以作为函数的修饰符,也可作为函数内的语句,也就是平时说的同步方法和同步语句块。如果 再细的分类,synchronized可作用于instance变量、object reference(对象引用)、static函数和class ...
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
在 Java 5 以前,synchronized 是仅有的同步手段,在代码中, synchronized 可以用来修饰方法,也可以使用在特定的代码块儿上,本质上
lock锁,lock锁和synchronized的对比 # Lock锁 JDK5.0后Java提供了一种更加强大的线程同步机制。一种显式定义同步锁对象来实现锁...Lock锁>同步代码块(已将进入了方法体,分配了相应的资源)>同步方法(在方法体外)
Lock接口与synchronized关键字在Java并发编程中都是用于实现同步机制的重要工具,但它们在使用方式、功能特性以及灵活性等方面存在一些显著的差异。 首先,从使用方式上来看,synchronized是Java语言内置的关键字,...
主要介绍了Java中使用synchronized关键字实现简单同步操作示例,本文起讲解了synchronized修饰函数、synchronized修饰代码块、synchronized修饰静态方法等内容,需要的朋友可以参考下
Java 对多线程的支持与同步机制深受...是平时说的同步方法和同步语句块。如果再细的分类,synchronized 可作用于instance 变量、 object reference(对象引用)、static 函数和class literals(类名称字面常量)身上。
synchronized关键字可以作为函数的修饰符,也可作为函数内的语句,也就是平时说的同步方法和同步语句块。如果 再细的分类,synchronized可作用于instance变量、object reference(对象引用)、static函数和class ...
同步分为同步方法和同步块两种方式。 锁定的内容分为锁定类的某个特定实例和锁定类对象(类的所有实例) 变量分为实例变量(不带static的变量)和类变量(带static的变量) 使用同步的原因 1、在...
同步的主要方式就是使用synchronized块,它既提供了互斥又提供了可见性保证。当两个线程都想访问共享的易变变量时,这两个线程不仅必须使用同步,而且如果它们正在使用synchronized块,那么这些synchronized 块还...