How to do it...

The recipe will show you three scenarios.

In the first scenario, LockType is defined at the class level:

@Singleton
@ConcurrencyManagement(ConcurrencyManagementType.CONTAINER)
@Lock(LockType.READ)
@AccessTimeout(value = 10000)
public class UserClassLevelBean {

private int userCount;

public int getUserCount() {
return userCount;
}

public void addUser(){
userCount++;
}

}

In the second scenario, LockType is defined at the method level:

@Singleton
@ConcurrencyManagement(ConcurrencyManagementType.CONTAINER)
@AccessTimeout(value = 10000)
public class UserMethodLevelBean {

private int userCount;

@Lock(LockType.READ)
public int getUserCount(){
return userCount;
}

@Lock(LockType.WRITE)
public void addUser(){
userCount++;
}
}

The third scenario is a self-managed bean:

@Singleton
@ConcurrencyManagement(ConcurrencyManagementType.BEAN)
public class UserSelfManagedBean {

private int userCount;

public int getUserCount() {
return userCount;
}

public synchronized void addUser(){
userCount++;
}
}