isaric opened a new pull request, #1544:
URL: https://github.com/apache/commons-lang/pull/1544

   **Issue:** [LANG-1790](https://issues.apache.org/jira/browse/LANG-1790)
   
   I continued based on the changes and suggestions made in PR 
[LANG-1656](https://github.com/apache/commons-lang/pull/1475). The PR has been 
left unchanged since Oct 30 2025. I hereby acknowledge using that code and the 
reviewers suggestions as the starting point for my work.
   
   According to the PR checklist I also acknowledge using the JetBrains AI in 
the writing of the PR description, not in the writing of the actual code. I 
have checked the description it wrote and I find it accurately describes the 
changes.
   
   One major difference to the initial PR was having to remove the FIFO test 
provided in the original PR. When running the test multiple times (ten or more) 
it would occasionally fail. I have read up on the Semaphore and fairness in the 
`java.util.concurrent.Semaphore` class and  I believe that the order cannot be 
guaranteed even with fairness.
   I have also tried checking the tests in [Open 
JDK](https://github.com/openjdk/jdk/tree/master/test/jdk/java/util/concurrent/Semaphore)
 for `java.util.concurrent.Semaphore` and I could not find a similar test in 
their repository. 
   
   ### Summary
   
   This PR enhances the `TimedSemaphore` class by adding optional FIFO (fair 
ordering) semaphore support, allowing applications to enforce fairness 
guarantees when multiple threads compete for permits. This is particularly 
valuable in scenarios where strict ordering and prevention of thread starvation 
are critical requirements.
   
   ### Implementation
   
   **Key Changes:**
   
   1. **Fairness Configuration**: Added a `fair` boolean field and 
corresponding `Builder.setFair(boolean)` method to enable/disable fair 
semaphore ordering. Fair mode uses the underlying 
`java.util.concurrent.Semaphore` in fair mode, enforcing FIFO ordering.
   
   2. **Backing Semaphore**: Introduced a backing `Semaphore` instance 
initialized with the fair flag, replacing direct permit management. This 
delegates fairness enforcement to the standard JDK semaphore implementation.
   
   3. **Builder Pattern Enhancement**: Extended the `Builder` inner class with 
a `setFair()` method, providing a flexible fluent API for configuration 
alongside existing options (`setPeriod()`, `setLimit()`, `setService()`, 
`setTimeUnit()`).
   
   4. **Acquisition Logic Updates**:
      - Added `fairTryAcquire()` helper method that respects the fairness 
setting:
        - **Fair mode**: Uses `semaphore.tryAcquire(0, TimeUnit.SECONDS)` to 
honor the FIFO queue
        - **Non-fair mode**: Uses `semaphore.tryAcquire()` for immediate 
acquisition attempts
      - Updated `acquire()` and `tryAcquire()` methods to leverage the backing 
semaphore
   
   5. **Period Management**: Modified `endOfPeriod()` to properly synchronize 
permit release through the backing semaphore, calculating the number of permits 
to release based on the current limit and available permits.
   
   ### Testing
   
   The test suite validates:
   
   - **Non-fair mode behavior**: Verifies existing non-blocking behavior is 
preserved
   - **Backward compatibility**: Ensures deprecated constructors continue to 
work (defaulting to non-fair mode)
   - **Concurrency handling**: Test cases in 
`ReflectionToStringBuilderConcurrencyTest.java` verify correct behavior under 
concurrent access patterns (note: some tests marked as `@Disabled` for known 
edge cases)
   - **Period transitions**: Validates that permit resets function correctly 
with the backing semaphore
   - **Limit modifications**: Confirms `setLimit()` properly adjusts semaphore 
state
   
   ### Backward Compatibility
   
   ✅ Fully backward compatible. Existing code continues to work without 
modification:
   - Default behavior (non-fair mode) is preserved
   - All existing constructors and factory methods remain functional
   - New fairness feature is opt-in via `Builder.setFair(true)`
   
   ### Benefits
   
   - **Prevents starvation**: Fair mode ensures no thread is starved 
indefinitely when competing for permits
   - **Predictable behavior**: FIFO ordering enables deterministic thread 
scheduling in critical sections
   - **Flexible configuration**: Clean builder API allows easy toggling of 
fairness at construction time
   - **Maintains simplicity**: No breaking changes to the public API
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to