一、.线程同步
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);
}
}