Synchronous and Asynchronous calls using Apex in Salesforce

Apex can be executed synchronously or asynchronously.

Synchronous:
In a Synchronous call, the thread will wait until it completes its tasks before proceeding to next. In a Synchronous call, the code runs in single thread.

Example:
Trigger
Controller Extension
Custom Controller

Asynchronous:
In a Asynchronous call, the thread will not wait until it completes its tasks before proceeding to next. Instead it proceeds to next leaving it run in separate thread. In a Asynchronous call, the code runs in multiple threads which helps to do many tasks as background jobs.

Example:
Batch
@future Annotation
Queueable Interface
Scheduled Apex