java中synchronized,线程同步

来源:互联网 发布:神经系统算法matlab 编辑:程序博客网 时间:2024/04/28 11:33

一、.线程同步

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

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

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

public class Nosys {/** * @param args *  */public static void main(String[] args) {// TODO Auto-generated method stubShare 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 stubshare.print(str);}}
可结果能为

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

1.同步方法

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

2.同步块

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

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


0 0
原创粉丝点击