线程同步的方式有哪些?线程如何实现同步?

TheDisguiser 2020-05-18 21:36:59 java常见问答 9431

在线程出现安全问题时我们就要用到线程同步,那如何实现线程同步大家知道吗?它又有几种实现方法呢?一起来看看吧。

一、什么是线程同步?

多个线程在访问同一个数据时,会出现可能线程安全问题,线程同步就是用来解决这些问的题的。

二、线程同步有哪些实现方法?

1、同步代码块:

synchronized(同一个数据){} 同一个数据:就是N条线程同时访问一个数据。

2、同步方法:

public synchronized 数据返回类型 方法名(){}

意思就是使用 synchronized 来修饰某个方法,则该方法就叫做同步方法。对于同步方法来说,不需要显示指定同步监视器,同步方法的同步监视器是 this 也就是该对象的本身通过使用同步方法,能够快速的将某类变成线程安全的类,会具有以下特征:

a这个类的对象可以被多个线程安全的访问。

b每个线程调用这个对象的任意方法之后,都会得到正确结果。

c每个线程调用这个对象的任意方法之后,这个对象状态依然保持合理状态。

注:synchronized关键字可以修饰方法,也可以修饰代码块,但不能修饰构造器,属性等。

三、如何实现线程同步?

示例:

synchronized(object)
{}
package com.xhj.thread;
/**
 * 线程同步的运用
 * 
 * @author XIEHEJUN
 * 
 */
public class SynchronizedThread
{
    class Bank
    {
        private int account = 100;
        public int getAccount()
        {
            return account;
        }
        /**
         * 用同步方法实现
         * 
         * @param money
         */
        public synchronized void save(int money)
        {
            account += money;
        }
        /**
         * 用同步代码块实现
         * 
         * @param money
         */
        public void save1(int money)
        {
            synchronized(this)
            {
                account += money;
            }
        }
    }
class NewThread implements Runnable {
            private Bank bank;
 
            public NewThread(Bank bank) {
                this.bank = bank;
            }
 
            @Override
            public void run() {
                for (int i = 0; i < 10; i++) {
                    // bank.save1(10);
                    bank.save(10);
                    System.out.println(i + "账户余额为:" + bank.getAccount());
                }
            }
 
        }
 
        /**
         * 建立线程,调用内部类
         */
        public void useThread() {
            Bank bank = new Bank();
            NewThread new_thread = new NewThread(bank);
            System.out.println("线程1");
            Thread thread1 = new Thread(new_thread);
            thread1.start();
            System.out.println("线程2");
            Thread thread2 = new Thread(new_thread);
            thread2.start();
        }
 
        public static void main(String[] args) {
            SynchronizedThread st = new SynchronizedThread();
            st.useThread();
        }
 
    }

注:同步是一种高开销的操作,因此应该尽量减少同步的内容。通常没有必要同步整个方法,使用synchronized代码块同步关键代码即可。

以上就是本篇文章的全部内容了,如果你想要深入的学习java及了解一些java常见问答知识,就快来关注我们的网站吧。

推荐阅读:

java线程安全的集合有哪些?

java线程安全如何实现?有哪些实现方法?

java守护线程是指什么?有什么作用?