更新时间:2022-06-10 09:24:00 来源:极悦 浏览1068次
Java中实现线程同步的方法有哪些?极悦小编来告诉大家。
也就是有修改同步关键字的方法。因为java中的每个对象都有一个内置锁,当你用这个关键字修改一个方法时,内置锁保护了整个方法。在调用方法之前,需要先获取内置锁,否则会处于阻塞状态。。
注意:Java多线程同步synchronized关键字也可以修改静态方法,如果调用静态方法,会锁定整个类。
也就是被synchronized关键字修改的语句块。被这个关键字修改的语句块被自动锁定,实现同步。
代码如下:
synchronized(object){
}
注意:同步是一项开销很大的操作,所以要尽量减少同步的内容。。一般不需要同步整个方法,使用同步的代码块可以同步关键代码。
package com.xhj.thread;
/**
* application of thread synchronization
*
* @author XIEHEJUN
*
*/
public class SynchronizedThread {
class Bank {
private int account = 100;
public int getAccount() {
return account;
}
/**
* realized by synchronous method
*
* @param money
*/
public synchronized void save(int money) {
account += money;
}
/**
* implement with synchronous code block
*
* @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 + " the account balance is :" + bank.getAccount());
}
}
}
/**
* set up a thread and call the inner class
*/
public void useThread() {
Bank bank = new Bank();
NewThread new_thread = new NewThread(bank);
System.out.println(" thread 1 ");
Thread thread1 = new Thread(new_thread);
thread1.start();
System.out.println(" thread 2 ");
Thread thread2 = new Thread(new_thread);
thread2.start();
}
public static void main(String[] args) {
SynchronizedThread st = new SynchronizedThread();
st.useThread();
}
}
例子加说明:
同步是多线程中的一个重要概念。在多线程环境中可以保证使用同步。,程序不会在设计之外产生错误结果。实现同步有两种方式。, 同步方法和同步块,都使用了synchronized关键字。
同步方法:在方法中添加同步修饰符,使其成为同步方法,该方法可以是静态的和非静态的,但不能是抽象类的抽象方法,也不能是接口中的接口方法。
(1)java.util.concurrent
(2)synchronized同步的
(3)ReentrantLockfinally
线程本地
ThreadLocal() : get() : initialValue() : "" set(T value) : value
//Bank
public class Bank{
//ThreadLocalaccount
private static ThreadLocal<Integer> account = new ThreadLocal<Integer>(){
@Override
protected Integer initialValue(){
return 100;
}
};
public void save(int money){
account.set(account.get()+money);
}
public int getAccount(){
return account.get();
}
}
0基础 0学费 15天面授
Java就业班有基础 直达就业
业余时间 高薪转行
Java在职加薪班工作1~3年,加薪神器
工作3~5年,晋升架构
提交申请后,顾问老师会电话与您沟通安排学习