import threading class DataHolder: def __init__(self): self.data = None self.lock = threading.Lock() def set_data(self, new_data): with self.lock: self.data = new_data def get_data(self): with self.lock: return self.data def writer_thread(data_holder): for i in range(10): data_holder.set_data(i) def reader_thread(data_holder): for _ in range(10): data = data_holder.get_data() print(f"Read data: {data}") def main(): data_holder = DataHolder() writer = threading.Thread(target=writer_thread, args=(data_holder,)) reader = threading.Thread(target=reader_thread, args=(data_holder,)) writer.start() reader.start() writer.join() reader.join() if __name__ == "__main__": main()