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