Java线程的同步与死锁

来源:互联网 发布:php获取数组元素个数 编辑:程序博客网 时间:2024/06/08 02:11

一、线程同步
同步就是指多个操作在同一个时间段只能有一个线程进行,其他线程要等待此线程完成之后才可以继续进行

这里写图片描述

在java中synchronized关键字可以通过两种方式实现同步:
*同步代码块(在java中有四种代码块:普通代码块、构造块、静态块、同步块)
*同步方法


1、使用同步代码块要传入一个锁定的对象,一般即当前对象this

public class MyThread implements Runnable {    private int ticket = 10;    @Override    public void run() {        for (int t = 0; t < 20; t++) {            synchronized (this) {//当前操作每一次只允许一个对象进入                if (this.ticket > 0) {                    try {                        Thread.sleep(100);                    } catch (InterruptedException e) {                        // TODO Auto-generated catch block                        e.printStackTrace();                    }                    System.out.println(Thread.currentThread().getName() + this.ticket--);                }            }        }    }}

2、同步方法:尽量使用同步方法

public class MyThread implements Runnable {    private int ticket = 10;    @Override    public void run() {        for (int t = 0; t < 20; t++) {            sale();//调用同步方法            }        }    public synchronized void sale() {        if (this.ticket > 0) {            try {                Thread.sleep(100);            } catch (InterruptedException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }            System.out.println(Thread.currentThread().getName() + this.ticket--);        }    }}

同步操作与异步操作相比,异步操作速度比较快,但是同步操作是线性安全的操作
尽量使用同步方法而非同步代码块

二、线程死锁
线程同步过多就有可能造成死锁

0 0