[ 
https://issues.apache.org/jira/browse/JEXL-194?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15282561#comment-15282561
 ] 

Henri Biestro commented on JEXL-194:
------------------------------------

As a temporary workaround, you already can run code under a 'synchronized' 
monitor as in :
{code}

    public static class Synchronizer extends MapContext {
        private final JexlContext context;

        public Synchronizer(JexlContext ctxt) {
            this.context =  ctxt;
        }
        public Object call(Object var, JexlScript script) {
            String[] parms = script.getParameters();
            boolean varisarg = parms != null && parms.length == 1;
            if (var == null) {
                return varisarg? script.execute(context, var) : 
script.execute(context);
            } else {
                synchronized (var) {
                    return varisarg? script.execute(context, var) : 
script.execute(context);
                }
            }
        }
    }

    @Test
    public void test196() throws Exception {
        Map<String, Object> ns = new TreeMap<String, Object>();
        ns.put("synchronized", Synchronizer.class);
        JexlContext jc = new MapContext();
        JexlEngine jexl = new JexlBuilder().namespaces(ns).create();
        JexlScript js0 = jexl.createScript("synchronized:call(x, 
(y)->{y.size()})", "x");
        Object size = js0.execute(jc, "foobar");
        Assert.assertEquals(6, size);
    }
{code}

> synchronize on iterableValue in foreach statement
> -------------------------------------------------
>
>                 Key: JEXL-194
>                 URL: https://issues.apache.org/jira/browse/JEXL-194
>             Project: Commons JEXL
>          Issue Type: Improvement
>    Affects Versions: 3.0
>            Reporter: Dmitri Blinov
>            Assignee: Henri Biestro
>            Priority: Minor
>
> Since it is a requirement to synchronize on simple Collections and 
> synchronized Collections while iterating over them and since jexl has no 
> instrument to control synchronization in script, I think its reasonable to 
> implement synchronization in jexl itself on iterableValue. In case of 
> concurrent collections it will possibly block other threads only if they are 
> synchronizing on those collections themselves, which will be complementary to 
> required synchronization in jexl.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to