Asynchronous programming is a programming paradigm that allows tasks to be executed concurrently, without blocking the main thread of execution. This can significantly improve the performance and responsiveness of an application, especially when dealing with long-running or computationally-intensive tasks, such as network requests or database operations.

There are several patterns and techniques that can be used to implement asynchronous programming in different programming languages. Here are some of the commonly used patterns:

1. Callbacks: In this pattern, a function takes a callback function as a parameter, which will be executed when the asynchronous task is completed. This pattern is widely used in JavaScript.

2. Promises: Promises are objects that represent the eventual completion or failure of an asynchronous operation. They provide a cleaner and more structured way to handle asynchronous code than callbacks. Promises have become a standard pattern in many programming languages, such as JavaScript, Python, and Java.

3. Futures: Futures are similar to promises, but they represent a value that may not be available yet. They provide a way to write asynchronous code in a more sequential and synchronous-like manner. Futures are commonly used in languages like Scala and Rust.

4. Coroutines: Coroutines are a higher-level abstraction that allow for more readable and sequential async code. They allow for the suspension of execution, so that other tasks can be performed while waiting for an asynchronous operation to complete. Coroutines are supported in languages like Kotlin, Python, and C#.

5. Reactive programming: Reactive programming is a programming paradigm that deals with asynchronous data streams and event-based programming. Reactive programming libraries, like RxJava or RxJS, provide abstractions and operators to compose and transform streams of data in a declarative and composable manner.

6. Async/await: Async/await is a syntactic sugar that allows for writing asynchronous code in a more synchronous-like manner. It combines the use of promises or futures with language-level constructs that make it easier to write and reason about asynchronous code. Async/await is supported in languages like JavaScript, Python, and C#.

These are just a few of the patterns and techniques used in asynchronous programming. The choice of pattern depends on the programming language and libraries being used, as well as the specific requirements of the application.