您的位置:首页 > 编程语言 > Java开发

java中synchronized,线程同步

2016-10-28 11:15 127 查看
一、.线程同步

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);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: