Synchroniz用法

1.同一个类的synchronized 锁住的方法,同一时间不能有多个线程同时访问
package com.mercurylake.test.tree;

import java.util.HashSet;
import java.util.Set;

import org.apache.commons.lang.StringUtils;

import com.sun.swing.internal.plaf.synth.resources.synth;

public class A  {
	public static void main(String[] args) {
		A x=new A();
		Runnable r1=new B(x,0);
		Runnable r2=new B(x,1);
		Thread t1=new Thread(r1);
		Thread t2=new Thread(r2);
		t1.start();
		t2.start();
	}
	public synchronized void  a1(){
		System.out.println("a1..begin");
		try {
			Thread.sleep(10000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("a1..end");
	}
	
	public synchronized void  b1(){
		System.out.println("b1");
	}
}
class B implements Runnable{
	private A a;
	private int mark;
	
	public B(A a, int mark) {
		super();
		this.a = a;
		this.mark = mark;
	}
	
	
	@Override
	public void run() {
		// TODO Auto-generated method stub
		if(mark==0){
			a.a1();
		}else a.b1();
	}
}

返回值:a1..begin ;a1..end ;b1

2.synchronized(this)代码块与 public synchronized  void a() 效果相同

package com.mercurylake.test.tree;

import java.util.HashSet;
import java.util.Set;

import org.apache.commons.lang.StringUtils;

import com.sun.swing.internal.plaf.synth.resources.synth;

public class A  {
	public static void main(String[] args) {
		A x=new A();
		Runnable r1=new B(x,0);
		Runnable r2=new B(x,1);
		Thread t1=new Thread(r1);
		Thread t2=new Thread(r2);
		t1.start();
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		t2.start();
	}
	public synchronized void  a1(){
		System.out.println("a1..begin");
		try {
			Thread.sleep(10000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("a1..end");
	}
	
	public  void  b1(){
		synchronized (this) {
			System.out.println("b1");
		}
	}
}
class B implements Runnable{
	private A a;
	private int mark;
	
	public B(A a, int mark) {
		super();
		this.a = a;
		this.mark = mark;
	}
	
	
	@Override
	public void run() {
		// TODO Auto-generated method stub
		if(mark==0){
			a.a1();
		}else a.b1();
	}
}
输出值与例1中相同

3.synchronized static 用法:锁的不再是实例,而是Class,同一个Class 都会受到同步约束

package com.mercurylake.test.tree;

import java.util.HashSet;
import java.util.Set;

import org.apache.commons.lang.StringUtils;

import com.sun.swing.internal.plaf.synth.resources.synth;

public class A  {
	public static void main(String[] args) {
		A x=new A();
		A y=new A();
		Runnable r1=new B(x,0);
		Runnable r2=new B(y,1);
		Thread t1=new Thread(r1);
		Thread t2=new Thread(r2);
		t1.start();
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		t2.start();
	}
	public synchronized static void  a1(){
		System.out.println("a1..begin");
		try {
			Thread.sleep(10000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("a1..end");
	}
	
	public synchronized  static void  b1(){
	
			System.out.println("b1");
		
	}
}
class B implements Runnable{
	private A a;
	private int mark;
	
	public B(A a, int mark) {
		super();
		this.a = a;
		this.mark = mark;
	}
	
	
	@Override
	public void run() {
		// TODO Auto-generated method stub
		if(mark==0){
			a.a1();
		}else a.b1();
	}
}
返回值与例1相同


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值