`

java多线程与线程同步

    博客分类:
  • java
阅读更多

 

             JAVA 线程同步的几种方式

 

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

public class SynTest {

 public static void main(String[] args) throws Exception{
  //1.两个线程共享变量,变量值不确定
  //nonsyn();
  //2.使用线程同步方法:synchronized save1
  //syn();
  //3.使用volatile 线程同步: volatile int account
  //vola();
  //4.使用重入锁ReentrantLock: save2() , new lock
  //lock();
  //5.使用局部变量ThreadLocal线程同步: ThreadLocal<int>
  Bank2 b=new Bank2();
  NewThread2 t=new NewThread2(b);
  
  Thread t1=new Thread(t,"t1");
  t1.start();
  Thread t2=new Thread(t,"t2");
  t2.start();
  
  
  t1.join();
  t2.join();
  System.out.println("非同步  account="+b.get());
 }

 static void nonsyn()throws Exception{
  Bank b=new Bank();
  NewThread t=new NewThread(b);
  
  Thread t1=new Thread(t,"t1");
  t1.start();
  Thread t2=new Thread(t,"t2");
  t2.start();
  
  
  t1.join();
  t2.join();
  System.out.println("非同步  account="+b.get());
 }
 
 static void syn()throws Exception{
  Bank b=new Bank();
  NewThread t=new NewThread(b);
  
  Thread t1=new Thread(t,"t1");
  t1.start();
  Thread t2=new Thread(t,"t2");
  t2.start();
  
  
  t1.join();
  t2.join();
  System.out.println("非同步  account="+b.get());
 }
 
 static void vola()throws Exception{
  Bank b=new Bank();
  NewThread t=new NewThread(b);
  
  Thread t1=new Thread(t,"t1");
  t1.start();
  Thread t2=new Thread(t,"t2");
  t2.start();
  
  
  t1.join();
  t2.join();
  System.out.println("非同步  account="+b.get());
 }
 
 static void lock()throws Exception{
  Bank b=new Bank();
  NewThread t=new NewThread(b);
  
  Thread t1=new Thread(t,"t1");
  t1.start();
  Thread t2=new Thread(t,"t2");
  t2.start();
  
  
  t1.join();
  t2.join();
  System.out.println("非同步  account="+b.get());
 }
}

class Bank{
 private int account;
 //private volatile int account;
 
 private Lock lock=new ReentrantLock();
 
 public void save(int money){
  this.account+=money;
 }
 
// public synchronized void save1(int money){
//  this.account+=money;
// }
 
 public void save2(int money){
  lock.lock();
  this.account+=money;
  lock.unlock();
 }
 
 public int get(){
  return this.account;
 }
}

class NewThread implements Runnable{
 private Bank bank;
 
 public NewThread(Bank bank){
  this.bank=bank;
 }

 public void run() {
  
  for(int i=0;i<30000;i++){
   //bank.save(10); //使用volatile 同步
   //bank.save1(10); //使用synchronized 同步
   bank.save2(10);//使用lock同步
   System.out.println("非同步  account="+bank.get());
   
  }
  
  //System.out.println( " account="+bank.get());//结果不确定20000
  
 }
 
}

class Bank2{
 private ThreadLocal<Integer> account=new ThreadLocal<Integer>(){
 
  protected Integer initialValue(){
   return 0;
  }
 };
 public void save(int money){
  account.set(account.get()+money);
 }
 
 public int get(){
  return this.account.get();
 }
}

class NewThread2 implements Runnable{
 private Bank2 bank;
 
 public NewThread2(Bank2 bank){
  this.bank=bank;
 }

 public void run() {
  
  for(int i=0;i<30000;i++){
   bank.save(10);
   //System.out.println(Thread.currentThread().getName()+"同步  account="+bank.get());
   
  }
  System.out.println(Thread.currentThread().getName()+"同步  account="+bank.get());
 }
 
}

 

   ThreadLocal 线程局部变量如何线程通信呢?

 

分享到:
评论

相关推荐

    Java多线程同步.pdf

    "Java多线程同步.pdf" Java多线程同步是指在Java语言中,如何使用synchronized关键字和其他同步机制来确保多线程程序的正确执行。在Java语言中,synchronized关键字用于对方法或者代码块进行同步,但是仅仅使用...

    Java多线程知识点总结

    Java多线程是Java编程语言中一个非常重要的概念,它允许开发者在一个程序中创建多个执行线程并行运行,以提高程序的执行效率和响应速度。在Java中,线程的生命周期包含五个基本状态,分别是新建状态(New)、就绪...

    java多线程的讲解和实战

    3. **线程同步与通信**: - 同步机制:为了防止多个线程访问同一资源时产生数据不一致的问题,Java提供了`synchronized`关键字,可以锁定代码块或整个方法,确保同一时刻只有一个线程执行。 - 等待/通知机制:`...

    java多线程经典案例

    本案例将深入探讨Java多线程中的关键知识点,包括线程同步、线程通信和线程阻塞。 线程同步是为了防止多个线程同时访问共享资源,导致数据不一致。Java提供了多种同步机制,如synchronized关键字、Lock接口...

    java多线程Demo

    Java多线程是Java编程中的一个重要概念,它允许程序同时执行多个任务,提高了程序的效率和响应速度。在Java中,实现多线程有两种主要方式:继承Thread类和实现Runnable接口。 1. 继承Thread类: 当我们创建一个新...

    java 多线程同步

    Java多线程同步是Java编程中关键的并发概念,它涉及到如何在多个线程访问共享资源时保持数据的一致性和完整性。`java.util.concurrent`包是Java提供的一个强大的并发工具库,它为开发者提供了多种线程安全的工具,...

    java多线程进度条

    总之,实现Java多线程进度条涉及线程同步、共享数据更新以及UI更新的协调。理解这些核心概念,并根据具体需求选择合适的方法,是构建高效、用户友好进度条的关键。在ProgressTest这个示例项目中,你可能会找到更多...

    Java多线程机制(讲述java里面与多线程有关的函数)

    Java多线程机制是Java编程中至关重要的一部分,它允许程序同时执行多个任务,提升应用程序的效率和响应性。以下是对各个知识点的详细说明: 9.1 Java中的线程: Java程序中的线程是在操作系统级别的线程基础上进行...

    JAVA单线程多线程

    ### JAVA中的单线程与多线程概念解析 #### 单线程的理解 在Java编程环境中,单线程指的是程序执行过程中只有一个线程在运行。这意味着任何时刻只能执行一个任务,上一个任务完成后才会进行下一个任务。单线程模型...

    JAVAJAVA多线程教学演示系统论文

    3. **线程同步与并发控制**:论文会深入讲解JAVA中的线程同步机制,如synchronized关键字、wait()、notify()和notifyAll()方法,以及Lock接口和ReentrantLock类的使用。此外,可能会探讨并发工具类,如Semaphore、...

    汪文君JAVA多线程编程实战(完整不加密)

    书中详细介绍了Java多线程的核心概念,如线程的创建、启动、同步、协作以及生命周期管理。读者将学习如何通过实现Runnable接口或继承Thread类来创建线程,以及如何使用Executor框架来管理线程池。 此外,书中还深入...

    JAVA多线程练习题答案。

    JAVA多线程练习题答案详解 在本文中,我们将对 JAVA 多线程练习题的答案进行详细的解释和分析。这些题目涵盖了 JAVA 多线程编程的基本概念和技术,包括线程的生命周期、线程同步、线程状态、线程优先级、线程安全等...

    java 多线程并发实例

    在Java编程中,多线程并发是...总之,Java的多线程并发实例可以帮助我们更好地理解和实践线程控制、同步机制以及经典的设计模式,提升我们的编程能力。通过不断学习和实践,我们可以编写出高效、安全的多线程并发程序。

    java多线程处理数据库数据

    在Java编程中,多线程处理是提升程序性能和效率的重要手段,特别是在处理大量数据库数据时。本主题将深入探讨如何使用Java的并发包(java.util.concurrent)来实现多线程对数据库数据的批量处理,包括增、删、改等...

    java多线程查询数据库

    综上所述,"java多线程查询数据库"是一个涉及多线程技术、线程池管理、并发控制、分页查询等多个方面的复杂问题。通过理解和掌握这些知识点,我们可以有效地提高数据库操作的效率和系统的响应速度。

    java多线程同步问题

    多线程注意:wait()方法的调用要有判定条件常用 while () obj.wait(timeout, nanos); ... // Perform action appropriate to condition } synchronized会影响共享数据,但对其他语句的执行不会有规律了!

    JAVA多线程编程技术PDF

    这份“JAVA多线程编程技术PDF”是学习和掌握这一领域的经典资料,涵盖了多线程的全部知识点。 首先,多线程的核心概念包括线程的创建与启动。在Java中,可以通过实现Runnable接口或继承Thread类来创建线程。创建后...

    深入浅出 Java 多线程.pdf

    在本文中,我们将深入浅出Java多线程编程的世界,探索多线程编程的基本概念、多线程编程的优点、多线程编程的缺点、多线程编程的应用场景、多线程编程的实现方法等内容。 一、多线程编程的基本概念 多线程编程是指...

    java多线程同步例子

    java多线程同步互斥访问实例,对于初学者或是温故而知新的同道中人都是一个很好的学习资料

Global site tag (gtag.js) - Google Analytics