diff --git a/java/java-impl/src/com/intellij/codeInspection/dataFlow/StandardInstructionVisitor.java b/java/java-impl/src/com/intellij/codeInspection/dataFlow/StandardInstructionVisitor.java
index 96ac6d0ba52e..02cce92a84ea 100644
--- a/java/java-impl/src/com/intellij/codeInspection/dataFlow/StandardInstructionVisitor.java
+++ b/java/java-impl/src/com/intellij/codeInspection/dataFlow/StandardInstructionVisitor.java
@@ -92,7 +92,9 @@ public class StandardInstructionVisitor extends InstructionVisitor {
onAssigningToNotNullableVariable(instruction, runner);
}
}
- memState.setVarValue(var, dfaSource);
+ if (!(psiVariable instanceof PsiField) || !psiVariable.hasModifierProperty(PsiModifier.VOLATILE)) {
+ memState.setVarValue(var, dfaSource);
+ }
}
memState.push(dfaDest);
diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/NullableAnonymousVolatile.java b/java/java-tests/testData/inspection/dataFlow/fixture/NullableAnonymousVolatile.java
new file mode 100644
index 000000000000..535f31d41c94
--- /dev/null
+++ b/java/java-tests/testData/inspection/dataFlow/fixture/NullableAnonymousVolatile.java
@@ -0,0 +1,26 @@
+import javax.swing.*;
+
+class Test {
+ public void setObj(Object obj) {
+ this.obj = obj;
+ }
+
+ public void test() {
+ obj = new Object();
+ javax.swing.SwingUtilities.invokeLater(new Runnable() {
+ public void run() {
+ Object o = obj;
+ if (o != null) {
+ System.out.println("x");
+ }
+ }
+ });
+ final Object u = new Object();
+ if (u != null) {
+ System.out.println("y");
+ }
+ obj = null;
+ }
+
+ private volatile Object obj;
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/NullableAnonymousVolatileNotNull.java b/java/java-tests/testData/inspection/dataFlow/fixture/NullableAnonymousVolatileNotNull.java
new file mode 100644
index 000000000000..1e8f1b0fd330
--- /dev/null
+++ b/java/java-tests/testData/inspection/dataFlow/fixture/NullableAnonymousVolatileNotNull.java
@@ -0,0 +1,24 @@
+import org.jetbrains.annotations.NotNull;
+
+import javax.swing.*;
+
+class Test {
+ public void setObj(Object obj) {
+ this.obj = obj;
+ }
+
+ public void test() {
+ obj = new Object();
+ SwingUtilities.invokeLater(new Runnable() {
+ public void run() {
+ Object o = obj;
+ if (o != null) {
+ System.out.println("x");
+ }
+ }
+ });
+ obj = null;
+ }
+
+ @NotNull private volatile Object obj;
+}
\ No newline at end of file
diff --git a/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionFixtureTest.java b/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionFixtureTest.java
index fe4ecf0d910c..4c356e81fe65 100644
--- a/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionFixtureTest.java
+++ b/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionFixtureTest.java
@@ -29,5 +29,7 @@ public class DataFlowInspectionFixtureTest extends JavaCodeInsightFixtureTestCas
public void testTryInAnonymous() throws Throwable { doTest(); }
public void testNullableAnonymousMethod() throws Throwable { doTest(); }
public void testNullableAnonymousParameter() throws Throwable { doTest(); }
+ public void testNullableAnonymousVolatile() throws Throwable { doTest(); }
+ public void testNullableAnonymousVolatileNotNull() throws Throwable { doTest(); }
}