线程同步

来源:互联网 发布:买卖点炒股软件 编辑:程序博客网 时间:2024/06/13 21:34

1、什么是线程同步和异步?
线程同步:即当有一个线程在对内存进行操作时,其他线程都不可以对这个内存地址进行操作,直到该线程完成操作, 其他线程才能对该内存地址进行操作,而其他线程又处于等待状态。
在Java中可以看成,多个线程操作同一个对象或执行同一个代码块时,必须排队,必须等上一个线程操作完下一个线程再操作。
线程异步:多个线程可以同时操作同一个对象或执行同一个代码块。
2、synchronized关键字实现线程同步
每个对象只能同时与一个线程加锁。
一个线程可以对同一个对象多次加锁。

  1. 线程访问使用synchronized修饰一个对象、对象中的方法或对象中的代码块时,必须获得该对象的对象锁。
  2. 当线程A与对象1加锁时,若A没释放对象1的锁,线程B无法与对象1加锁,无法访问synchronized修饰的内容。
  3. 当对象1既有synchronized代码块也有非synchronized代码块时,其它线程可以异步访问非synchronized代码块。
  4. 一个对象只能与同时与一个线程加锁,所以当一个对象有两个synchronized方法,线程A访问synchronized方法1时,线程B无法访问synchronized方法2。
public class MyThread implements Runnable{    /**修饰方法1**/    public synchronized void fangfa1() throws Exception{        System.out.println("fangfa1");        Thread.sleep(5000);    }    /**修饰方法2**/    public synchronized void fangfa2() throws Exception{        System.out.println("fangfa2");    }    @Override    public void run(){        try{        fangfa1();        }catch(Exception e){            e.printStackTrace();        }    }/**************主线程****************************/public static void main(String[] args) throws Exception{    MyThread mythread = new MyThread();    Thread thread = new Thread(mythread);    thread.start();    Thread.sleep(1000);//此处休眠一秒是为了让子线程先执行,否则CPU会随机执行子线程或主线程    mythread.fangfa2();}}

输出结果
fangfa1
/*等待六秒/
fangfa2

子线程开启后访问fangfa1,然后休眠5秒,休眠过程中子线程持有对象锁,所以主线程无法对象锁,无法访问同步的fangfa2,五秒后子线程释放对象锁,此时主线程持对象锁访问fangfa2。 如果fangfa2去掉synchronized ,则主线程会异步访问fangfa2。

0 0
原创粉丝点击