java中线程同步方法

简介: java中线程同步方法

文章目录

基本概念

共享变量

共享变量必须要保证线程安全,对于共享变量复合操作,保证复合操作的线程安全性。

线程通信协作的最常见方式

  • syncrhoized加锁的线程的Object类的wait()/notify()/notifyAll()
  • ReentrantLock类加锁的线程的Condition类的await()/signal()/signalAll()

线程同步

一个线程对共享数据的操作应该具有原子性,在对共享数据进行操作没有完成操作之前,其他线程不允许打断该线程的操作,不能使共享数据的完整性得到破坏。

实现线程同步的方法

同步代码方法:sychronized 关键字修饰的方法

同步代码块:sychronized 关键字修饰的代码块

使用特殊变量域volatile实现线程同步:volatile关键字为域变量的访问提供了一种免锁机制

使用重入锁实现线程同步:reentrantlock类是可冲入、互斥、实现了lock接口的锁他与sychronized方法具有相同的基本行为和语义

线程互斥

对于共享的资源,只允许一个线程访问,其他线程不能进行访问,如果多个线程要使用使用该资源的线程必须等待,直到占用资源者释放该资源。

多线程安全

使用synchronized关键字

同步方法块

public class SyncronizedDemo implements Runnable {

   private int count = 5;

   @Override

   public synchronized void run() {

       count--;

       System.out.println(Thread.currentThread().getName()+" count = "+count );

   }

   public static void main(String[] args) {

       //创建

       SyncronizedDemo thread = new SyncronizedDemo();

       for(int i = 0 ; i < 5 ;i++){

           new Thread(thread).start();

       }

   }

}

同步代码块

/**

* synchronized实现线程输出

*/

public class SyncronizedDemo implements Runnable {

   private int count = 5;

   private final Object o = new Object();

   /*@Override

   public synchronized void run() {

       count--;

       System.out.println(Thread.currentThread().getName()+" count = "+count );

   }*/

   @Override

   public void run() {

       synchronized (o) {

           count--;

           System.out.println(Thread.currentThread().getName() + " count = " + count);

       }

   }

   public static void main(String[] args) {

       //创建

       SyncronizedDemo thread = new SyncronizedDemo();

       for(int i = 0 ; i < 5 ;i++){

           new Thread(thread).start();

       }

   }

}

输出结果:

Thread-0 count = 4

Thread-4 count = 3

Thread-3 count = 2

Thread-2 count = 1

Thread-1 count = 0

使用并发包下的类实现同步

AtomicInteger,AtomicBoolean,AtomicLong等

201bd463bb5c497eb44ee24d64029853.png

/**

* synchronized实现线程输出

*/

public class SyncronizedDemo implements Runnable {

   private AtomicInteger count = new AtomicInteger(5);

   @Override

   public void run() {

       System.out.println(Thread.currentThread().getName() + " count = " + count.decrementAndGet());

   }

   public static void main(String[] args) {

       //创建

       SyncronizedDemo thread = new SyncronizedDemo();

       for(int i = 0 ; i < 5 ;i++){

           new Thread(thread).start();

       }

   }

}

使用Lock来实现

public class Lock implements Runnable{

   private int count = 5;

   private ReentrantLock lock = new ReentrantLock();

   @Override

   public void run() {

       lock. lock();

       try {

           System.out.println(Thread.currentThread().getName()+"获得锁 :Count = "+count--);

       } catch (Exception e) {

          e.printStackTrace();

       } finally {

           System. out. println(Thread.currentThread().getName()+"释放锁");

           lock. unlock();

       }

   }

   public static void main(String[] args) {

       Lock thread = new Lock();

       for(int i = 0 ; i < 5 ;i++){

           new Thread(thread).start();

       }

   }

}

打印输出:

Thread-0获得锁 :Count = 5

Thread-0释放锁

Thread-1获得锁 :Count = 4

Thread-1释放锁

Thread-2获得锁 :Count = 3

Thread-2释放锁

Thread-3获得锁 :Count = 2

Thread-3释放锁

Thread-4获得锁 :Count = 1

Thread-4释放锁


相关文章
|
1天前
|
存储 Java
|
3天前
|
存储 缓存 安全
深度剖析Java HashMap:源码分析、线程安全与最佳实践
深度剖析Java HashMap:源码分析、线程安全与最佳实践
|
4天前
|
缓存 前端开发 JavaScript
一篇文章助你搞懂java中的线程概念!纯干货,快收藏!
【8月更文挑战第11天】一篇文章助你搞懂java中的线程概念!纯干货,快收藏!
13 0
一篇文章助你搞懂java中的线程概念!纯干货,快收藏!
|
2天前
|
存储 Java
|
3天前
|
算法 安全 Java
深入解析Java多线程:源码级别的分析与实践
深入解析Java多线程:源码级别的分析与实践
|
4天前
|
Dart API C语言
Dart ffi 使用问题之想在C/C++中创建异步线程来调用Dart方法,如何操作
Dart ffi 使用问题之想在C/C++中创建异步线程来调用Dart方法,如何操作
|
4天前
|
Java UED
基于SpringBoot自定义线程池实现多线程执行方法,以及多线程之间的协调和同步
这篇文章介绍了在SpringBoot项目中如何自定义线程池来实现多线程执行方法,并探讨了多线程之间的协调和同步问题,提供了相关的示例代码。
25 0
|
4天前
|
Java API
Java8 Lambda 设计和实现问题之在Java 8的Stream API中,parallel=false时collect方法是如何实现的
Java8 Lambda 设计和实现问题之在Java 8的Stream API中,parallel=false时collect方法是如何实现的
|
4天前
|
Java 程序员 调度
深入浅出Java多线程编程
Java作为一门成熟的编程语言,在多线程编程方面提供了丰富的支持。本文将通过浅显易懂的语言和实例,带领读者了解Java多线程的基本概念、创建方法以及常见同步工具的使用,旨在帮助初学者快速入门并掌握Java多线程编程的基础知识。
4 0
|
4天前
|
Java
java中获取当前执行线程的名称
这篇文章介绍了两种在Java中获取当前执行线程名称的方法:使用`Thread`类的`getName`方法直接获取本线程的名称,以及使用`Thread.currentThread()`方法获取当前执行对象的引用再调用`getName`方法。