美文网首页
多线程的3种同步方法

多线程的3种同步方法

作者: Stringer | 来源:发表于2016-12-16 17:54 被阅读49次

未同步:

Account.java(账户类)
package thread01;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class Account {
    private double balance;
    private Lock accountLock=new ReentrantLock();

    public double getBalance() {
        return balance;
    }

    public void deposit(double money) {
        
            double newBalance = balance + money;
            try {
                Thread.sleep(10);
            } catch (InterruptedException ex) {
                ex.printStackTrace();
            }
            balance = newBalance;
        
            System.out.println("Account balance:"+balance);
    }
}

AddMoneyThread.java(线程类)
package thread01;

public class AddMoneyThread implements Runnable {

    private Account account;
    private double money;

    public AddMoneyThread(Account account, double money) {
        this.account = account;
        this.money = money;
    }

    @Override
    public void run() {
            account.deposit(money);
        
    }

}
测试类
package thread01;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Test01 {

    public static void main(String[] args) {
        Account account=new Account();
        ExecutorService service=Executors.newFixedThreadPool(100);
        
        for(int i=0;i<100;i++){
            service.execute(new AddMoneyThread(account, 1));
        }
        service.shutdown();
        while(!service.isTerminated()){}
        
        System.out.println("账户余额:"+account.getBalance());
    }

}
测试结果:2,没有同步

</br>
</br>
</br>

同步有三种方法

方法1:修改Account.java中deposit方法,添加修饰符synchronized
package thread01;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class Account {
    private double balance;
    private Lock accountLock=new ReentrantLock();

    public double getBalance() {
        return balance;
    }

    public synchronized void deposit(double money) {
        
            double newBalance = balance + money;
            try {
                Thread.sleep(10);
            } catch (InterruptedException ex) {
                ex.printStackTrace();
            }
            balance = newBalance;
        
            System.out.println("Account balance:"+balance);
    }
}
方法2:AddMoneyThread.java中添加synchronized块
package thread01;

public class AddMoneyThread implements Runnable {

    private Account account;
    private double money;

    public AddMoneyThread(Account account, double money) {
        this.account = account;
        this.money = money;
    }

    @Override
    public void run() {
        synchronized(account){
            account.deposit(money);
        }
    }

}
方法3:Account.java,添加lock机制
package thread01;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class Account {
    private double balance;
    private Lock accountLock=new ReentrantLock();

    public double getBalance() {
        return balance;
    }

    public void deposit(double money) {
        accountLock.lock();
        try{
            double newBalance = balance + money;
            try {
                Thread.sleep(10);
            } catch (InterruptedException ex) {
                ex.printStackTrace();
            }
            balance = newBalance;
        }finally{
            accountLock.unlock();
            System.out.println("Account balance:"+balance);
        }
        
        
    }
}

面试题:简述synchronized 和java.util.concurrent.locks.Lock的异同?
答:Lock是Java 5以后引入的新的API,和关键字synchronized相比
主要相同点:Lock 能完成synchronized所实现的所有功能;
主要不同点:Lock有比synchronized更精确的线程语义和更好的性能,而且不强制性的要求一定要获得锁。synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且最好在finally 块中释放(这是释放外部资源的最好的地方)。

相关文章

  • 5月份第一周学习安排

    学习内容: java多线程及线程同步的方法(使用) java多线程各种同步方法的原理和优缺点 java多线程设计模...

  • Java并发之synchronized

    Java多线程同步关键词是常用的多线程同步手段。它可以修饰静态类方法,实例方法,或代码块。修饰static静态方法...

  • JUC学习笔记三

    JUC学习笔记三 用于解决多线程同步问题的方式 隐式锁(synchronized) 同步代码块 同步方法 显式锁(...

  • Java多线程及synchronized用法理解

    如何写一个多线程Demo 误区一:多线程方法中的public void run()中的代码都是同步方法。publi...

  • 多线程"锁重入"概念

    Java多线程锁重入是指: 在已经获得锁的同步方法或同步代码块内部可以调用锁定对象的其他同步方法, 不需要重新获取...

  • 同步锁Lock

    用于解决多线程安全问题的方式:synchronized 隐式锁 同步代码块 同步方法 jdk1.5后新增 同步锁...

  • 多线程设计模式阅读日记

    1.多线程的常用方法 wait(), notify(), notifyAll(), 方法都必须在同步代码中,而Th...

  • Java多线程同步2——同步方法

    java多线程同步除了上文说到的同步代码块,还可以使用同步方法,还是银行取钱的那个问题,代码如下 public c...

  • dispatch_barrier_async的作用是什么?

    线程同步。并发队列中,多线程读写,写的时候不能读,可用这个方法。

  • Java多线程--基础概念

    Java多线程--基础概念 必须知道的几个概念 同步和异步 同步方法一旦开始,调用者必须等到方法调用返回后,才能执...

网友评论

      本文标题:多线程的3种同步方法

      本文链接:https://www.haomeiwen.com/subject/vhormttx.html