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释放锁


相关文章
|
2月前
|
Java
Java语言实现字母大小写转换的方法
Java提供了多种灵活的方法来处理字符串中的字母大小写转换。根据具体需求,可以选择适合的方法来实现。在大多数情况下,使用 String类或 Character类的方法已经足够。但是,在需要更复杂的逻辑或处理非常规字符集时,可以通过字符流或手动遍历字符串来实现更精细的控制。
239 18
|
2月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
166 1
|
2月前
|
Java 编译器 Go
【Java】(5)方法的概念、方法的调用、方法重载、构造方法的创建
Java方法是语句的集合,它们在一起执行一个功能。方法是解决一类问题的步骤的有序组合方法包含于类或对象中方法在程序中被创建,在其他地方被引用方法的优点使程序变得更简短而清晰。有利于程序维护。可以提高程序开发的效率。提高了代码的重用性。方法的名字的第一个单词应以小写字母作为开头,后面的单词则用大写字母开头写,不使用连接符。例如:addPerson。这种就属于驼峰写法下划线可能出现在 JUnit 测试方法名称中用以分隔名称的逻辑组件。
201 4
|
2月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
193 1
|
2月前
|
编解码 Java 开发者
Java String类的关键方法总结
以上总结了Java `String` 类最常见和重要功能性方法。每种操作都对应着日常编程任务,并且理解每种操作如何影响及处理 `Strings` 对于任何使用 Java 的开发者来说都至关重要。
292 5
|
3月前
|
算法 安全 Java
除了类,Java中的接口和方法也可以使用泛型吗?
除了类,Java中的接口和方法也可以使用泛型吗?
142 11
|
3月前
|
Java 开发者
Java 函数式编程全解析:静态方法引用、实例方法引用、特定类型方法引用与构造器引用实战教程
本文介绍Java 8函数式编程中的四种方法引用:静态、实例、特定类型及构造器引用,通过简洁示例演示其用法,帮助开发者提升代码可读性与简洁性。
|
3月前
|
存储 Oracle Java
|
3月前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案
Java 数据库 Spring
153 0

热门文章

最新文章