java中synchronized,线程同步

一、.线程同步

Java使用监控器(也称对象锁)实现同步。每个对象都有一个监控器,使用监控器可以保证一次允许一个线程执行对象的同步语句。即在对象的同步语句执行完毕之前,其他试图执行当前对象的同步语句的线程都将处于阻塞状态,只有线程在当前对象的同步语句执行完毕后,监控器才会释放对象,并让最高优先级的阻塞线程处理它的同步语句。

也可以这样理解对象锁,拨打公共信息服务台时,接话员可以被多个客户访问,但每次接话员只能服务一个客户。当其为某个客户服务时,其状态为"忙碌",其他客户只能等待。当接话员为当前的客户服务结束时,状态就变成“空闲”,可以为其他客户服务。

下述代码演示不使用同步机制可能出现的情况。


public class Nosys {

	/**
	 * @param args
	 * 
	 */
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Share share=new Share();
		Caller caller1=new Caller(share, "A");
		Caller caller2=new Caller(share, "B");
		Caller caller3=new Caller(share, "C");
		
	}

}
class Share{
	void print(String str){
		System.out.print("["+str);
	
	try{
		Thread.sleep(1000);
	}catch(InterruptedException e){
		
		}
	System.out.println("]");
	}
}

class Caller implements Runnable{
	String str;
	Share share;
	Thread thread;
	public Caller(Share share,String str){
		this.share=share;
		this.str=str;
		//实例化进程
		thread=new Thread(this);
		thread.start();
	}
	public void run() {
		// TODO Auto-generated method stub
		share.print(str);
		
	}
	
}
可结果能为

在java中使用synchronized关键字来实现对象锁。有两种方式使用synchronized:

1.同步方法

使用synchronized来修饰需要同步的方法。调整上述代码,只需将synchronized加到print前即可

2.同步块

只需将实例的对象放入同步块中即可,即:

public void run() {
		// TODO Auto-generated method stub
synchronized(share){
		share.print(str);
}
		
	}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值