您的位置:首页 > 编程语言 > Java开发

JAVA中线程同步的常用方法

2016-06-26 11:03 302 查看
为何要使用同步? 

    java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查), 

    将会导致数据不准确,相互之间产生冲突,因此加入同步锁以避免在该线程没有完成操作之前,被其他线程的调用, 

    从而保证了该变量的唯一性和准确性。

 

 

 

1.同步方法 

    即有synchronized关键字修饰的方法。 

    由于java的每个对象都有一个内置锁,当用此关键字修饰方法时, 

    内置锁会保护整个方法。在调用该方法前,需要获得内置锁,否则就处于阻塞状态。

 

 

    代码如: 

    public synchronized void save(){}

 

 

   注: synchronized关键字也可以修饰静态方法,此时如果调用该静态方法,将会锁住整个类

 

 

 

2.同步代码块 

    即有synchronized关键字修饰的语句块。 

    被该关键字修饰的语句块会自动被加上内置锁,从而实现同步

 

 

    代码如: 

    synchronized(object){ 

    }

 

 

    注:同步是一种高开销的操作,因此应该尽量减少同步的内容。 

    通常没有必要同步整个方法,使用synchronized代码块同步关键代码即可。 

     

    代码实例: 

    

 

复制代码

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();

        }

 

    }

复制代码

     
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: