JAVA | 24

来源:互联网 发布:oracle数据库搜索引擎 编辑:程序博客网 时间:2024/05/23 01:00

同步就是一个线程对象等待另一个线程对象执行完毕。

同步与异步相比较,异步操作的执行速度高,同步操作时数据的安全性较高,属于安全的线程。大部分情况下使用异步。

多个线程访问同一资源时,一定要处理好同步,可以采用同步代码块或者同步方法来实现。

过多地使用同步可能会造成死锁,死锁是程序开发中由于逻辑错误而产生的问题。并不是简单地就出现的。

class MyThread implements Runnable {    private int ticket = 100;    @Override    public void run() {        for (int i = 0; i < 200; i++) {            if (this.ticket > 0) {                try {                    Thread.sleep(10);                } catch (InterruptedException e) {                    e.printStackTrace();                }                System.out.println(Thread.currentThread().getName() + " " + this.ticket);                this.ticket--;            }        }    }}public class Main {    public static void main(String[] args) {        MyThread myThread1 = new MyThread();        Thread A = new Thread(myThread1,"Thread A");        Thread B = new Thread(myThread1,"Thread B");        Thread C = new Thread(myThread1,"Thread C");        Thread D = new Thread(myThread1,"Thread D");        A.start();        B.start();        C.start();        D.start();    }}

同步代码块

class MyThread implements Runnable {    private int ticket = 1000;    @Override    public void run() {        for (int i = 0; i < 2000; i++) {            synchronized (this) { //当前操作每次只允许一个对象进入                if (this.ticket > 0) {                    try {                        Thread.sleep(1);                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                    System.out.println(Thread.currentThread().getName() + " " + this.ticket);                    this.ticket--;                }            }        }    }}public class Main {    public static void main(String[] args) {        MyThread myThread1 = new MyThread();        Thread A = new Thread(myThread1,"Thread A");        Thread B = new Thread(myThread1,"Thread B");        Thread C = new Thread(myThread1,"Thread C");        Thread D = new Thread(myThread1,"Thread D");        A.start();        B.start();        C.start();        D.start();    }}

同步方法

class MyThread implements Runnable {    private int ticket = 100;    @Override    public void run() {        for (int i = 0; i < 200; i++) {            this.sale();        }    }    public synchronized void sale(){        if (this.ticket > 0) {            try {                Thread.sleep(10);            } catch (InterruptedException e) {                e.printStackTrace();            }            System.out.println(Thread.currentThread().getName() + " " + this.ticket);            this.ticket --;        }    }}public class Main {    public static void main(String[] args) {        MyThread myThread1 = new MyThread();        Thread A = new Thread(myThread1,"Thread A");        Thread B = new Thread(myThread1,"Thread B");        Thread C = new Thread(myThread1,"Thread C");        Thread D = new Thread(myThread1,"Thread D");        A.start();        B.start();        C.start();        D.start();    }}
原创粉丝点击