Atomically sets a field of bits for an AtomicInteger. - Java java.util.concurrent.atomic

Java examples for java.util.concurrent.atomic:AtomicInteger

Description

Atomically sets a field of bits for an AtomicInteger.

Demo Code

/*/*from   ww w.j  a  va2 s .  c  om*/
 * This file is part of Spout.
 *
 * Copyright (c) 2011 Spout LLC <http://www.spout.org/>
 * Spout is licensed under the Spout License Version 1.
 *
 * Spout is free software: you can redistribute it and/or modify it under
 * the terms of the GNU Lesser General Public License as published by the Free
 * Software Foundation, either version 3 of the License, or (at your option)
 * any later version.
 *
 * In addition, 180 days after any changes are published, you can use the
 * software, incorporating those changes, under the terms of the MIT license,
 * as described in the Spout License Version 1.
 *
 * Spout is distributed in the hope that it will be useful, but WITHOUT ANY
 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for
 * more details.
 *
 * You should have received a copy of the GNU Lesser General Public License,
 * the MIT license and the Spout License Version 1 along with this program.
 * If not, see <http://www.gnu.org/licenses/> for the GNU Lesser General Public
 * License and see <http://spout.in/licensev1> for the full license, including
 * the MIT license.
 */
//package com.java2s;
import java.util.concurrent.atomic.AtomicInteger;

public class Main {
    /**
     * Atomically sets a field of bits for an AtomicInteger.  The mask parameter indicates which bits are part of the field.  Only these bits in expect are compared with the current value and updated if
     * there is a match
     *
     * @param i the AtomicInteger
     * @param mask the bits of the field
     * @param expect the expected value (only the masked bits)
     * @param update the updated value
     * @return false if the bit were successfully cleared
     */
    public static boolean setField(AtomicInteger i, int mask, int expect,
            int update) {
        boolean success = false;
        while (!success) {
            int current = i.get();
            if ((expect & mask) != (current & mask)) {
                return false;
            }
            int next = (current & (~mask)) | (update & (mask));
            success = i.compareAndSet(current, next);
        }
        return true;
    }
}

Related Tutorials