Table of contents
1.
Introduction
2.
Thread Safety
3.
Methods to Make Ruby Object Thread Safe
3.1.
1️⃣Make it stateless & frozen
3.2.
2️⃣Use thread-safe structure for local state
3.3.
3️⃣Protect the state with mutexes
4.
Frequently Asked Questions
4.1.
What is thread safe?
4.2.
Explain the dynamic nature of Ruby Language.
4.3.
How do you know if something is thread safe?
4.4.
Explain chaining methods for thread safety.
4.5.
What are the features of a Ruby program?
5.
Conclusion
Last Updated: Mar 27, 2024
Easy

Chaining Methods for Thread Safety in Ruby

Author GAZAL ARORA
0 upvote
Career growth poll
Do you think IIT Guwahati certified course can help you in your career?

Introduction

Ruby is a general-purpose, interpreted programming language. It is an object-oriented programming language in itself. Also, it is a server-side language, just like Python and PERL. It features an attractive syntax that is simple to read and write. 

Ruby

Thread Safety

Multithreading is a feature of Java that allows for concurrently executing several threads. Our data will give inconsistent results if many threads work on it while its value changes. And that situation is not thread-safe. When a thread is working on an object, and it prevents another thread from working on the same object, this process is called Thread Safety.

Thread Safety

🤔Let's say you have an object used (called) from several threads. What can you do to ensure it is thread-safe?

Methods to Make Ruby Object Thread Safe

1️⃣Make it stateless & frozen

Here is the most basic method, which is simple and safe. Make your object stateless. It means to prevent your object from having any internal state over the long term. In other words, avoid using instance variables (@ivars) and only use local variables.

⭐You can freeze the object to ensure that you are not unintentionally adding state. This way, if you ever try to refactor it, it will throw an error.

class CommandHandler
  def initialize
    makeThreadsafeByStateless
  end

  def call(cmd)
    localVar = cmd.something
    output(localVar)
  end

  private
  def makeThreadsafeByStateless
    freeze
  end

  def output(localVar)
    puts(localVar)
  end
end

cmdHandler = CommandHandler.new

 

Multiple threads can freely use your object since it has no local state. That’s how your object is thread safe.

2️⃣Use thread-safe structure for local state

If you know that an object is used between multiple threads, you can divide its state per thread. Use ThreadLocalVar from the concurrent-ruby project for this.

Shared, mutable, isolated variable called a "ThreadLocalVar" has a distinct value for each thread. This variable is generally used as an Instance variable in objects that need to maintain different states for various threads.

require 'concurrent'

class Employees
  def initialize
    @employee = Concurrent::ThreadLocalVar.new{ [] }
  end

  def addEmployee(employee)
    @employee.value += [employee]
  end

  def notify
    @employee.value.each(&:call)
  end

  def removeEmployee(employee)
    @employee.value -= [employee]
  end
end

EMPLOYEES = Employees.new

 

EMPLOYEES can be used from within multiple threads since its state is different for different threads. @employee.value is a different array for every thread. Hence, your object is thread safe.

📝This pattern is used in RailsEventStore to maintain a list of short-term handlers interested in events posted by the current thread. For example, when parsing and processing an XLSX file, an import process can collect statistics about the quantity of ProductImported and ProductImportErrored events.

3️⃣Protect the state with mutexes

Here, all threads share the object's state in this method, but only one can access it simultaneously. Hence, your object is thread safe.

require 'thread'

class Employees
  def initialize
    @semaphore = Mutex.new
    @employees = []
  end

  def addEmployee(employee)
    @semaphore.synchronize do
      @employees += [employee]
    end
  end

  def notify
    @semaphore.synchronize do
      @employees.each(&:call)
    end
  end

  def removeEmployee(employee)
    @semaphore.synchronize do
      @employees -= [employee]
    end
  end
end

EMPLOYEES = Employees.new

Frequently Asked Questions

What is thread safe?

It implies a situation in programming that does not allow multiple threads to change the same data at once. However, your program may work as expected, and appear thread safe, even if it is fundamentally not.

Explain the dynamic nature of Ruby Language.

Ruby is a dynamic language; you can insert new methods into classes at runtime, create aliases for existing processes, and even define methods on individual objects.

How do you know if something is thread safe?

You are thread safe if it is never possible for two threads to get the same object with an uninitialized id since you would never attempt to modify the id concurrently.

Explain chaining methods for thread safety.

Our method Module does the alias chaining.synchronize_method, which in turn uses a helper method Module.create_alias to define an appropriate alias for any given method (including operator methods like +).

What are the features of a Ruby program?

A Ruby program can dynamically set named variables, invoke prescribed methods, and even define new classes and ways.

Conclusion

In this article, we discussed chaining Methods for Thread Safety in Ruby. However, you may want to pursue our premium courses to give your job an advantage over the competition!

With our Coding Ninjas Studio Guided Path, you may learn about Data Structures and Algorithms, Competitive Programming, JavaScript, System Design, and more! Check out these mock test series and participate in the contests on Coding Ninjas Studio if you want to put your coding talents to the test! However, if you've just started school and are looking for answers to concerns raised by digital behemoths such as Amazon, Microsoft, Uber, and others. As part of your placement preparations, you must evaluate the obstaclesinterview experiences, and interview package in this case. 

Please vote for our blogs if you find them valuable and exciting.

Happy learning, Ninjas!!

Thank You
Live masterclass