线程静态同步与非静态差别

那么,在static方法和非static方法前面加synchronized到底有什么不同呢?

大家都知道,static的方法属于类方法,它属于这个Class(注意:这里的Class不是指Class的某个具体对

象),那么static获取到的锁,就是当前调用这个方法的对象所属的类(Class,而不再是由这个Class产生

的某个具体对象了)。而非static方法获取到的锁,就是当前调用这个方法的对象的锁了。所以他们之间不

会产生互斥。

package com.jack.zhang.chapter9.classlock;

/**
 *
 * @author EX-LIUQI001
 *
 */
public class Test {

	public static synchronized void staticX() throws InterruptedException {
		for (int i = 0; i < 10; i++) {
			Thread.sleep(1000);
			System.out.println("staticX.......................");
		}
	}

	public synchronized void x() throws InterruptedException {

		for (int i = 0; i < 10; i++) {
			Thread.sleep(1000);
			System.out.println("x.......................");
		}

	}

	public static void main(String[] args) {
		final Test test1 = new Test();
		Thread thread = new Thread(new Runnable() {
			public void run() {
				try {
					test1.x();
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}, "a");

		Thread thread1 = new Thread(new Runnable() {
			public void run() {
				try {
					Test.staticX();
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}, "b");
		thread1.start();
		thread.start();
	}
}

运行结果是:

staticX.......................

x.......................

x.......................

staticX.......................

staticX.......................

x.......................

x.......................

staticX.......................

x.......................

staticX.......................

staticX.......................

x.......................

x.......................

staticX.......................

x.......................

staticX.......................

x.......................

staticX.......................

x.......................

staticX.......................

那当我们想让所有这个类下面的对象都同步的时候,也就是让所有这个类下面的对象共用同一把锁的时候,我们如何办呢?

看代码:

package com.jack.zhang.chapter9.classlock;

/**
 *
 * @author EX-LIUQI001
 *
 */
public class Test2 {
	public final static Byte[] locks = new Byte[0];

	public static void staticX() throws InterruptedException {
		synchronized (locks) {
			for (int i = 0; i < 10; i++) {
				Thread.sleep(1000);
				System.out.println("staticX.......................");
			}
		}
	}

	public void x() throws InterruptedException {
		synchronized (locks) {
			for (int i = 0; i < 10; i++) {
				Thread.sleep(1000);
				System.out.println("x.......................");
			}
		}
	}

	public static void main(String[] args) {
		final Test2 test1 = new Test2();
		Thread thread = new Thread(new Runnable() {
			public void run() {
				try {
					test1.x();
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}, "a");

		Thread thread1 = new Thread(new Runnable() {
			public void run() {
				try {
					Test2.staticX();
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}, "b");
		thread1.start();
		thread.start();
	}
}

运行结果:

staticX.......................

staticX.......................

staticX.......................

staticX.......................

staticX.......................

staticX.......................

staticX.......................

staticX.......................

staticX.......................

staticX.......................

x.......................

x.......................

x.......................

x.......................

x.......................

x.......................

x.......................

x.......................

x.......................

x.......................

时间: 2024-08-01 07:45:49

线程静态同步与非静态差别的相关文章

java synchronized静态同步方法与非静态同步方法,同步语句块

摘自:http://topmanopensource.iteye.com/blog/1738178 进行多线程编程,同步控制是非常重要的,而同步控制就涉及到了锁. 对代码进行同步控制我们可以选择同步方法,也可以选择同步块,这两种方式各有优缺点,至于具体选择什么方式,就见仁见智了,同步块不仅可以更加精确的控制对象锁,也就是控制锁的作用域,何谓锁的作用域?锁的作用域就是从锁被获取到其被释放的时间.而且可以选择要获取哪个对象的对象锁.但是如果在使用同步块机制时,如果使用过多的锁也会容易引起死锁问题,同

区分同步代码块、静态同步方法、非静态同步方法的锁

同步代码块.静态同步方法.非静态同步方法的锁分别是: 同步代码块可以使用自定义的Object对象,也可以使用this或者当前类的字节码文件(类名.class): 静态同步方法的锁是当前类的字节码文件(类名.class): 非静态同步方法的锁是this: 证明方法: 两个线程之间实现同步,一个线程使用同步代码块,一个线程使用同步方法. 如果这两个线程同步了,说明了使用的是同一个锁: 创建线程类(以售票为例) /** * @methodDesc 售票线程类 */ public class Threa

静态对象与非静态对象

Java静态对象和非静态对象有什么区别?? 静态对象                                                        非静态对象      是类共同拥有的.                                          是类独立拥有的, 内存空间上是固定的                                              空间在各个附属类里面分配 先分配静态对象的空间                   

Java显示的静态初始化和非静态实例初始化

静态初始化只执行一次,实例初始化每次创建实例都会执行. 1.创建一个Spoon类: package com.samsung.wx; public class Spoon { static { System.out.println("显示的静态初始化"); } { System.out.println("非静态实例初始化"); } public void f1(int i) { System.out.println(i); } } 2.测试代码: package co

静态代码块&amp;非静态代码块&amp;构造函数

总结:静态代码块总是最先执行.非静态代码块跟非静态方法一样,跟对象有关.只不过非静态代码块在构造函数之前执行.父类非静态代码块.构造函数执行完毕后(相当于父类对象初始化完成), 才开始执行子类的非静态代码块和构造函数. 相同点:都是在JVM加载类时且在构造方法执行之前执行,在类中都可以定义多个,一般在代码块中对一些static变量进行赋值. 不同点:静态代码块在非静态代码块之前执行(静态代码块—>非静态代码块—>构造方法). 静态代码块只在第一次new执行一次,之后不再执行,而非静态代码块在每

关于静态变量和非静态变量的区别

关于静态变量和非静态变量的区别 静态变量:被static修饰的变量,加载类的时候被创建,不随对象的创建而改变,静态变量位于方法区,类消失对应的变量消失. 非静态变量:不被static修饰的变量,每创建一次对象,就会为变量分配一次内存,存放在堆内存中,对象消失对应的变量消失. JAVA中初始化的顺序: 加载类: 静态变量初始化 静态代码块:[其只能调度静态的,不能调度非静态的] 成员变量 构造代码块 构造方法 普通代码块 原文地址:https://www.cnblogs.com/wangwswan

java 静态资源,非静态资源,父类子类,构造方法之间的初始化循序

java面试经常被问静态资源,非静态资源,父类子类,构造方法之间的执行顺序.下面添加两个类做个测试 class Parent { // 静态变量 public static String p_StaticField = "父类--静态变量"; // 变量(其实这用对象更好能体同这一点,如专门写一个类的实例) //如果这个变量放在初始化块的后面,是会报错的,因为你根本没有被初始化 public String p_Field = "父类--变量"; // 静态初始化块

Static静态变量和非静态变量

Static静态变量:   不同的对象共享这个变量的存储空间 而不是静态变量   每个对象具有可变的存储器空间 public class StaticDemo { private int count=0; private static int staticCount=0; public StaticDemo() { System.out.println(++count); System.out.println(++staticCount); } public static void main(S

静态全局变量和非静态全局变量

类的全局变量,也叫外部变量,在全局变量前面加static就是静态全局变量: 1.存储方式相同:全局变量本身是静态存储方式,所以两者在存储方式上无区别: 2.作用域不同:非静态变量的作用域是整个源程序,即其他类调用到该类时,可以访问到非静态全局变量:而静态全局变量只能是在本类中可访问: 3.访问方式不同:静态变量可以通过类直接访问,非静态变量需要实例化一个对象来访问: