在线程出现安全问题时我们就要用到线程同步,那如何实现线程同步大家知道吗?它又有几种实现方法呢?一起来看看吧。
一、什么是线程同步?
多个线程在访问同一个数据时,会出现可能线程安全问题,线程同步就是用来解决这些问的题的。
二、线程同步有哪些实现方法?
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常见问答知识,就快来关注我们的网站吧。
推荐阅读: