Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Android

Cách sử dụng removeLast() trong ConcurrentLinkedDeque trên Android

Giới thiệu về removeLast() trong ConcurrentLinkedDeque

removeLast() lấy và xóa phần tử cuối cùng (tail) của deque. Ném NoSuchElementException nếu deque rỗng.

ConcurrentLinkedDeque là unbounded deque thread-safe, lock-free (CAS), hiệu năng cao trong môi trường đa luồng cạnh tranh.

Ví dụ minh họa

Bước 1: Tạo project

Android Studio → File → New Project.

Bước 2: Layout

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:app="https://schemas.android.com/apk/res-auto"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:gravity="center"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:orientation="vertical">
    <TextView
        android:id="@+id/actionEvent"
        android:textSize="40sp"
        android:layout_marginTop="30dp"
        android:layout_width="wrap_content"
        android:layout_height="match_parent" />
</LinearLayout>

Bước 3: Code (src/MainActivity.java)

package com.example.myapplication;

import android.os.Build;
import android.os.Bundle;
import android.support.annotation.RequiresApi;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.TextView;
import java.util.concurrent.ConcurrentLinkedDeque;

public class MainActivity extends AppCompatActivity {
    ConcurrentLinkedDeque<String> concurrentLinkedDeque;

    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        concurrentLinkedDeque = new ConcurrentLinkedDeque<>();
        final TextView actionEvent = findViewById(R.id.actionEvent);

        concurrentLinkedDeque.add("sai");
        concurrentLinkedDeque.add("ram");
        concurrentLinkedDeque.add("krishna");
        concurrentLinkedDeque.add("prasad");

        actionEvent.setText("" + concurrentLinkedDeque);

        actionEvent.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                concurrentLinkedDeque.removeLast();
                actionEvent.setText("" + concurrentLinkedDeque);
            }
        });
    }
}

Kết quả

Ban đầu: [sai, ram, krishna, prasad]

Click 1: [sai, ram, krishna] (xóa "prasad")

Click 2: [sai, ram] (xóa "krishna")

Click 3: [sai] (xóa "ram")

Click 4: [] (xóa "sai")

Click 5: Crash - NoSuchElementException

Xử lý an toàn

// Cách 1: Kiểm tra trước
if (!concurrentLinkedDeque.isEmpty()) {
    concurrentLinkedDeque.removeLast();
}

// Cách 2: pollLast() - trả về null (KHUYẾN NGHỊ)
String last = concurrentLinkedDeque.pollLast();
if (last != null) {
    // Đã xóa thành công
}

// Cách 3: Try-catch
try {
    concurrentLinkedDeque.removeLast();
} catch (NoSuchElementException e) {
    // Deque rỗng
}

So sánh removeLast() vs pollLast()

Phương thức Rỗng Trả về Sử dụng khi
removeLast() Ném NoSuchElementException E Chắc chắn không rỗng
pollLast() Trả về null E hoặc null Không chắc chắn, an toàn

Ứng dụng - Work Stealing (LIFO từ cuối)

// Thread-local deque cho work-stealing
ConcurrentLinkedDeque<Task> localQueue = new ConcurrentLinkedDeque<>();

// Owner thread: push/pop từ cuối (LIFO - cache friendly)
localQueue.addLast(task); // push
Task myTask = localQueue.removeLast(); // pop - LIFO

// Thief thread: steal từ đầu (FIFO - fair)
Task stolen = localQueue.pollFirst(); // steal - FIFO

Đặc điểm ConcurrentLinkedDeque

  • Lock-free: CAS operations, không lock
  • Unbounded: Không bao giờ đầy
  • Hiệu năng: Tốt nhất cho high-contention
  • Iterator: Weakly consistent
  • Không blocking operations
  • Không cho phép null

So sánh với LinkedBlockingDeque

Đặc điểm LinkedBlockingDeque ConcurrentLinkedDeque
Bounded Optional Không (Unbounded)
Blocking ops Có (take/put) Không
Lock ReentrantLock Lock-free (CAS)
Phù hợp Producer-consumer bounded High-concurrency, non-blocking

Lưu ý

  • Không dùng cho producer-consumer cần blocking
  • Phù hợp: work-stealing, non-blocking algorithms
  • removeLast() O(1) amortized
  • Iterator không bao giờ ConcurrentModificationException