Java多线程的同步问题

本文最后更新于:1 年前

1 - synchronized关键字对代码块的同步

public class ThreadSynchronization {
    public static void main(String[] args) {
        TestThread  t = new TestThread();
        // 启动四个线程,并实现资源共享

        new Thread(t).start();
        new Thread(t).start();
        new Thread(t).start();
        new Thread(t).start();
    }
}

class TestThread implements Runnable{
    private int tickets = 5;
    @Override
    public void run(){
        while (true) {
            // 利用synchronized关键字对这一代码块进行同步,避免共享资源的随意访问
            synchronized (this) {
                if (tickets <= 0) break;
                try {
                    Thread.sleep(1000);
                } catch (Exception e) {
                    e.printStackTrace();
                }

                System.out.println(Thread.currentThread().getName()
                 + "出售票" + tickets);
                tickets -= 1;
            }
        }
    }
}

2 - synchronized关键字对方法的同步

public class ThreadSynchronization {
    public static void main(String[] args) {
        TestThread  t = new TestThread();
        // 启动四个线程,并实现资源共享

        new Thread(t).start();
        new Thread(t).start();
        new Thread(t).start();
        new Thread(t).start();
    }
}

class TestThread implements Runnable{
    private int tickets = 5;
    @Override
    public void run(){
        while (tickets > 0){
            sale();
        }
    }
    // 利用synchronized关键字对这本方法进行同步,避免共享资源的随意访问
    public synchronized void sale() {
        if (tickets > 0) {
            try {
                Thread.sleep(1000);
            } catch (Exception e) {
                e.printStackTrace();
            }

            System.out.println(Thread.currentThread().getName() + "出售票" + tickets);
            tickets -= 1;
        }
    }
}

3 - 在Java中,synchronized方法在同一时刻只能被一个线程调用,因此性能很差,从JDK1.5开始Java的API中引入了另一个锁的机制,这种锁机制包含在java.util.concurrent.locks包中

4 - 当系统中出现不同的读、写线程同时访问某一资源时,需要考虑共享互斥问题,可使用 synchronized 解决问题。若对性能要求较高的情况下,可考虑使用 ReadWriteLock 接口及其 ReentrantReadWriteLock 实现类。此外,为了在高并发情况下获取较高的吞吐率,建议使用 Lock 接口及其 ReentrantLock 实现类来替换以前的 synchronized 方法或代码块

以上, 3-4段内容,均引自<<Java从入门到精通(第二版)>> 张玉宏主编