Concurrency: рд╕рд╛рдЭрд╛ рд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рд╛рде рд░рд╣рдиреЗ рдХреЗ 6 рддрд░реАрдХреЗ

рд╕рдВрдЧрд╛рдорд┐рддрд┐

рдорд▓реНрдЯреА-рдереНрд░реЗрдбреЗрдб рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдореЗрдВ рдХрдИ рдХрдард┐рдирд╛рдЗрдпрд╛рдВ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдореБрдЦреНрдп рд╕рд╛рдЭрд╛ рд╕реНрдерд┐рддрд┐ рдФрд░ рдкреНрд░рджрд╛рди рдХреА рдЧрдИ рдЧреБрдард▓реА рдХреЗ рдХреБрд╢рд▓ рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдХреЛрд░ рдХреЗ рдЙрдкрдпреЛрдЧ рдкрд░ рдЕрдЧрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреАред

рдПрдХ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдПрдХ рд╕рд╛рдЭрд╛ рд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рд╛рде, рджреЛ рдмрд┐рдВрджреБ рд╣реИрдВ рдЬреЛ рд╕рднреА рдХрдард┐рдирд╛рдЗрдпреЛрдВ рдХрд╛ рдХрд╛рд░рдг рдмрдирддреЗ рд╣реИрдВ: рджреМрдбрд╝ рдХреА рд╕реНрдерд┐рддрд┐ рдФрд░ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рджреГрд╢реНрдпрддрд╛ред рдПрдХ рджреМрдбрд╝ рд░рд╛рдЬреНрдп рдореЗрдВ, рдзрд╛рдЧреЗ рдПрдХ рд╕рд╛рде рд░рд╛рдЬреНрдп рдмрджрд▓рддреЗ рд╣реИрдВ, рдЧреИрд░-рдирд┐рдпрддрд╛рддреНрдордХ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд▓рд┐рдП рдЕрдЧреНрд░рдгреА рд╣реЛрддреЗ рд╣реИрдВред рдФрд░ рджреГрд╢реНрдпрддрд╛ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдбреЗрдЯрд╛ рдмрджрд▓рдиреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рджреВрд╕рд░реЗ рдХреЗ рд▓рд┐рдП рдЕрджреГрд╢реНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдЦ рдЗрди рд╕рдорд╕реНрдпрд╛рдУрдВ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рдЫрд╣ рддрд░реАрдХреЗ рдмрддрд╛рдПрдЧрд╛ред

рд╕рднреА рдЙрджрд╛рд╣рд░рдг рдЬрд╛рд╡рд╛ рдореЗрдВ рджрд┐рдП рдЧрдП рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдирдореЗрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рд╣реИрдВ рдФрд░ рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд╡реЗ рдЬрд╛рд╡рд╛ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рд╣реЛрдВрдЧреЗред рдпрд╣ рд▓реЗрдЦ рд╕рдореАрдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рд╣реИ рдФрд░ рдпрд╣ рд╕рдВрдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИред рдЗрд╕реА рд╕рдордп, рдпрд╣ рдЙрди рд▓рд┐рдВрдХреНрд╕ рд╕реЗ рднрд░рд╛ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рд╢рдмреНрджреЛрдВ рдФрд░ рдХрдердиреЛрдВ рдХрд╛ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдг рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред



рд╕рд╛рдЭрд╛ рдХреА рдЧрдИ рдЕрд╡рд╕реНрдерд╛



рдореИрдВ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреА рдЧрдгрдирд╛ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдкрд░ рдПрдХ рд╕рд╛рдЭрд╛ рд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рд╛рде рдХрд╛рдо рджрд┐рдЦрд╛рдКрдВрдЧрд╛ред
рдЧрдгрдирд╛ рдХрд╛ рд╕реВрддреНрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

f(0) = 0 f(1) = 1 f(n) = f(n - 1) + f(n - 2) , n >= 2 


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:

 public interface FibonacciGenerator<T> { /** *    */ T next(); /** *     */ public T val(); } 


рд╣рдорд╛рд░реА рдХрдХреНрд╖рд╛рдПрдВ FibonacciGenerator рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреАред рдпрд╣ рд╕реВрддреНрд░ рд╕реЗ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд▓реЗ рдирдВрдмрд░ рдХреЛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рджреЛ рдкрд┐рдЫрд▓реЗ рд╡рд╛рд▓реЗ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ - рдпрд╣ рд╕рд╛рдЭрд╛ рд╕реНрдерд┐рддрд┐ рд╣реЛрдЧреА рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдпреЛрдЧрд┐рддрд╛ рд╣реЛрдЧреАред рд╣рдорд╛рд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдзрд╛рдЧрд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣реА рд╣реИ, рдЙрдкрднреЛрдХреНрддрд╛рдУрдВ рдХреА рдПрдХ рд╕рд╛рде рд╕рдВрдЦреНрдпрд╛ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛, рдпрд╣ рдЕрдкрдиреЗ рдЖрдХреНрд░рдордгрдХрд╛рд░рд┐рдпреЛрдВ рдХреЛ рдмрдирд╛рдП рд░рдЦреЗрдЧрд╛ рдФрд░ рдЕрдиреБрдмрдВрдз рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдЧрд╛ред рдФрд░ рдЗрд╕рд▓рд┐рдП, рдЪрд▓реЛ рд╢реБрд░реВ рдХрд░реЗрдВред

рддрд╛рд▓рд╛



рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдХрдХреНрд╖рд╛ рдХреЗ рдХрд╛рдо рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд░рдиреЗ рдХрд╛ рдкрд╣рд▓рд╛ рддрд░реАрдХрд╛ рддрд╛рд▓реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдФрд░ рд╕рднреА рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдШреЛрд╖рд┐рдд рдХрд░рдирд╛ рд╣реИред рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╡реЗрдХреНрдЯрд░ рдХреНрд▓рд╛рд╕ рд╣реИред

 public class IntrinsicLock implements FibonacciGenerator<BigInteger> { private BigInteger curr = BigInteger.ONE; private BigInteger next = BigInteger.ONE; @Override public synchronized BigInteger next() { BigInteger result = curr; curr = next; next = result.add(next); return result; } @Override public synchronized BigInteger val() { return curr; } } 


рд╣рдореЗрдВ рдПрдХ рдРрд╕рд╛ рд╡рд░реНрдЧ рдорд┐рд▓рд╛ рд╣реИ рдЬреЛ рдиреНрдпреВрдирддрдо рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реБрдП рдмрд╣реБ-рд╕реВрддреНрд░реАрдп рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдкреНрд░рджрд░реНрд╢рди рдХрд╛ рддреНрдпрд╛рдЧ рдХрд░рддреЗ рд╣реИрдВред рдХрдХреНрд╖рд╛ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рд╡реИрд╕рд╛ рд╣реА рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рдЗрд╕реЗ рдПрдХрд▓-рдереНрд░реЗрдбреЗрдб рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рддрд╛рд▓реЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рд╕рдорд╕реНрдпрд╛рдПрдВ рдЖрддреА рд╣реИрдВ рдЬреИрд╕реЗ: рдЧрддрд┐рд░реЛрдз , рд▓рд╛рдЗрд╡рд▓реЙрдХ , рдЖрджрд┐ред

рдареАрдХ-рдард╛рдХ рддрд╛рд▓рд╛ рд▓рдЧрд╛ рд╣реБрдЖ



рдЕрдЧрд▓рд╛ рддрд░реАрдХрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реА рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рднрд╛рдЧреЛрдВ рдореЗрдВ рддреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рдП рдФрд░ рдХреЗрд╡рд▓ рдЙрди рд╡рд░реНрдЧреЛрдВ рдХреЛ рд▓реЙрдХ рдХрд┐рдпрд╛ рдЬрд╛рдП рдЬрд┐рдирдореЗрдВ рд╕рд╛рдЭрд╛ рд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рд╛рде рдХрд╛рдо рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг oncurrentHashMap рд╣реИ ред рдЗрд╕рдореЗрдВ, рд╕рднреА рдбреЗрдЯрд╛ рдХреЛ рдХрдИ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдкреНрд░рд╡реЗрд╢ рдХрд░рддреЗ рд╕рдордп, рдХреЗрд╡рд▓ рд╡рд╣ рднрд╛рдЧ рдЕрд╡рд░реБрджреНрдз рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдкрд░рд┐рд╡рд░реНрддрди рдлрд┐рд▓рд╣рд╛рд▓ рд╣реЛ рд░рд╣рд╛ рд╣реИред рдЕрдзрд┐рдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рддрд╛рд▓реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╡рд┐рдХрд▓реНрдк рднреА рд╣реИ, рдЬреИрд╕реЗ: рд╕реНрдЯреИрдореНрдкрдбреЗрд▓реЙрдХ (рдЬрд╛рд╡рд╛ 8) , рд░реАрдбреНрд░рд╛рдЗрдЯрд▓реЙрдХ ред рд╕рд╣реА рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде, рд╣рдо рдПрдХ рдЙрдЪреНрдЪ рд╕реНрддрд░ рдХреА рд╕рдорд╛рдирддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред ReadWriteLock рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрджрд╛рд╣рд░рдг:

 public class FineGrainedLock implements FibonacciGenerator<BigInteger> { private final ReadWriteLock lock = new ReentrantReadWriteLock(); private BigInteger curr = BigInteger.ONE; private BigInteger next = BigInteger.ONE; @Override public BigInteger next() { BigInteger result; lock.writeLock().lock(); try { //     result = curr; curr = next; next = result.add(next); return result; } finally { lock.writeLock().unlock(); } } @Override public BigInteger val() { lock.readLock().lock(); try { //   write lock // `    return curr; } finally { lock.readLock().unlock(); } } } 


рд╣рдордиреЗ рдХрдХреНрд╖рд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд┐рдпрд╛ рдФрд░ рдЙрдЪреНрдЪ рдкрдардиреАрдп рдереНрд░реВрдкреБрдЯ рд╣рд╛рд╕рд┐рд▓ рдХрд┐рдпрд╛ред рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рддрд╛рд▓реЗ рдХреЗ рд╕рднреА minuses рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, minuses рд╕реЗ рдпрд╣ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдХрд┐ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реЛ рдЧрдпрд╛ (рд╢реЛрд░ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ рдЬреЛ рдХрд╛рдо рдХреЗ рддрд░реНрдХ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рдерд╛) рдФрд░ рдЧрд▓рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдмрдврд╝ рдЧрдИред

рд▓реЙрдХ-рдлреНрд░реА рдПрд▓реНрдЧреЛрд░рд┐рджрдо



рддрд╛рд▓реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреНрд░рджрд░реНрд╢рди рдФрд░ рд╢реБрджреНрдзрддрд╛ рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рд╕рд╛рд░реА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдЬрдиреНрдо рджреЗрддрд╛ рд╣реИред рдЧреИрд░-рдЕрд╡рд░реБрджреНрдз рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╣реИ ред рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдкреНрд░реЛрд╕реЗрд╕рд░ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдкрд░рдорд╛рдгреБ рд╕рдВрдЪрд╛рд▓рди рдкрд░ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ рд╕рдорд╡рд░реНрддреА рд╣рд╛рд╢рдк рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рд╡рд┐рдзрд┐ред рдЧреИрд░-рдЕрд╡рд░реЛрдзрдХ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдореМрдЬреВрджрд╛ рдЧреИрд░-рдЕрд╡рд░реБрджреНрдз рд╡рд░реНрдЧреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ: рд╕рдорд╡рд░реНрддреАрд▓рдВрдХрд▓ рдХреНрдпреВ , рд╕рдорд╡рд░реНрддреА рд╣рд╛рд╢рдкреЗрдЬрд╝, рдЖрджрд┐ред рд╣рдо рдЕрдкрдиреА рдХрдХреНрд╖рд╛ рдХреЗ рдЧреИрд░-рдЕрд╡рд░реЛрдзрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд▓рд┐рдЦреЗрдВрдЧреЗред

 public class LockFree implements FibonacciGenerator<BigInteger> { //      private static class State { final BigInteger next; final BigInteger curr; public State(BigInteger curr, BigInteger next) { this.next = next; this.curr = curr; } } //     private final AtomicReference<State> atomicState = new AtomicReference<>( new State(BigInteger.ONE, BigInteger.ONE)); public BigInteger next() { BigInteger value = null; while (true) { //    State state = atomicState.get(); //         value = state.curr; //    State newState = new State(state.next, state.curr.add(state.next)); //         //   ,     , //      if (atomicState.compareAndSet(state, newState)) {break;} } return value; } @Override public BigInteger val() { return atomicState.get().curr; } } 


рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдлрд╛рдпрджреЛрдВ рдореЗрдВ рд╕реЗ, рдпрд╣ рдЕрд╡рд░реБрджреНрдз рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рд╡реГрджреНрдзрд┐ рдХреЗ рд▓рд╛рдпрдХ рд╣реИред рдФрд░ рдпрд╣ рднреА, рдХреЛрдИ рдХрдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ, рддрд╛рд▓реЗ рдХреА рдЦрд╛рдорд┐рдпреЛрдВ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ред рдирдХрд╛рд░рд╛рддреНрдордХ рдкрдХреНрд╖ рдпрд╣ рд╣реИ рдХрд┐ рдЧреИрд░-рдЕрд╡рд░реЛрдзрдХ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рд╕рд╛рде рдЖрдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдмрд╣реБрдд рдХрдард┐рди рд╣реИред

рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдЯреНрд░рд╛рдВрд╕реЗрдХреНрд╢рдирд▓ рдореЗрдореЛрд░реА



рдЧреИрд░-рдЕрд╡рд░реЛрдзрдХ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛ рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдЯреНрд░рд╛рдВрд╕реЗрдХреНрд╢рдирд▓ рдореЗрдореЛрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣реИред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рд▓реЗрдирджреЗрди рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рдорд╛рди рд╣реИред рдпрд╣ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛рдлреА рдирдИ рд╣реИ (1995) рдФрд░ рд▓реЛрдХрдкреНрд░рд┐рдп рднрд╛рд╖рд╛рдУрдВ рдХреЗ рдмреАрдЪ, рджреЗрд╢реА рд╕рдорд░реНрдерди рдХреЗрд╡рд▓ рдХреНрд▓реЛрдЬрд░ рдореЗрдВ рд╣реИред рд▓рд╛рдЗрдмреНрд░реЗрд░реА-рд╕реНрддрд░ STM рд╕рдорд░реНрдерди рдЬрд╛рд╡рд╛ рд╕рд╣рд┐рдд рдХрдИ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИред рдореИрдВ рдЕрдХреНрдХрд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдПрд╕рдЯреАрдПрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ред

 public class STM implements FibonacciGenerator<BigInteger> { //      //         private final Ref<BigInteger> curr = new Ref<>(BigInteger.ONE); private final Ref<BigInteger> next = new Ref<>(BigInteger.ONE); @Override public BigInteger next() { //   return new Atomic<BigInteger>() { //    //   I (https://en.wikipedia.org/wiki/ACID) @Override public BigInteger atomically() { //      BigInteger result = curr.get(); //      curr.set(next.get()); next.set(result.add(next.get())); //       // .  ,   ,   //      . //   ,     . return result; } //    }.execute(); } @Override public BigInteger val() { //    return curr.get(); } } 


рдХреЛрдб рдХреЛ рд╕рдордЭрдирд╛ рдЖрд╕рд╛рди рд╣реИ рдФрд░ рдЧреИрд░-рдЕрд╡рд░реБрджреНрдз рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдФрд░ рддрд╛рд▓реЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдХреЛрдИ рд╢реЛрд░ рдкреИрджрд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо рдХрдо рдЙрддреНрдкрд╛рджрдХрддрд╛ рдФрд░ рд╕реАрдорд┐рдд рдкреНрд░рдпреЛрдЬреНрдпрддрд╛ рдХреЗ рд╕рд╛рде рднреБрдЧрддрд╛рди рдХрд░рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдПрд╕рдЯреАрдПрдо рд▓реЗрдЦрдХреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкрд╛рдардХ рд╣реЛрдиреЗ рдкрд░ рдЕрдЪреНрдЫрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░рддрд╛ рд╣реИред

рдЕрдЪрд▓ рд╕реНрдерд┐рддрд┐



рд╕рдорд╕реНрдпрд╛рдПрдБ рдЗрд╕ рддрдереНрдп рдХреЗ рд╕рд╛рде рд╕рд╛рдЭрд╛ рдХрд░рддреА рд╣реИрдВ рдХрд┐ рдпрд╣ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рд╣реИред рдпрд╣реА рд╣реИ, рдПрдХ рд╡рд░реНрдЧ рдХреЛ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд░реВрдк рд╕реЗ рдбрд┐рдЬрд╛рдЗрди рдХрд░рдХреЗ, рдЖрдк рдкреНрд░рддрд┐рдмрдВрдз рдХреЗ рдмрд┐рдирд╛ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдереНрд░реЗрдб-рд╕реБрд░рдХреНрд╖рд┐рдд рднреА рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рдЕрдХреНрд╕рд░ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдФрд░ рд╡рд┐рд╢реЗрд╖ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕реНрдореГрддрд┐ рдХреА рд▓рд╛рдЧрдд рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реЛ рд╕рдХрддреА рд╣реИред

 public class Immutable { private final BigInteger next; //   public final BigInteger val; private Immutable(BigInteger next, BigInteger val) { this.next = next; this.val = val; } public Immutable next() { return new Immutable(val.add(next), next); } public static Immutable first() { return new Immutable(BigInteger.ONE, BigInteger.ONE); } } 


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рджреЗрдЦрд╛, рдХреНрд▓рд╛рд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрджрд▓ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рддрд░реАрдХреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

рдкреГрдердХ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрди



рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдЙрди рддрдХ рдкрд╣реБрдВрдЪ рд╣рдореЗрд╢рд╛ рдПрдХ рд╣реА рдзрд╛рдЧреЗ рддрдХ рд╕реАрдорд┐рдд рд╣реЛрддреА рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдорд▓реНрдЯреАрдереНрд░реЗрдбреЗрдб рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕рдорд╕реНрдпрд╛рдПрдВ рдирд╣реАрдВ рд╣реЛрдВрдЧреАред рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЕрднрд┐рдиреЗрддрд╛ рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ ред рдЕрднрд┐рдиреЗрддрд╛ рдРрд╕реА рдЗрдХрд╛рдЗрдпрд╛рдБ рд╣реИрдВ рдЬреЛ рдЙрди рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рдорд╛рди рд╣реЛрддреА рд╣реИрдВ рдЬрд┐рдирдХреА рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрди рдЕрд╡рд╕реНрдерд╛ рдФрд░ рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реЛрддрд╛ рд╣реИред рдЕрднрд┐рдиреЗрддрд╛рдУрдВ рдХрд╛ рдкрд░рд╕реНрдкрд░ рд╕рдВрдкрд░реНрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдВрджреЗрд╢ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣реЛрддрд╛ рд╣реИред рд╕рдВрджреЗрд╢ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╣реИрдВ рдФрд░ рдЕрднрд┐рдиреЗрддрд╛ рдПрдХ рдмрд╛рд░ рдореЗрдВ рдПрдХ рд╕рдВрджреЗрд╢ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИред рдХрд┐рд╕реА рд╕рдВрджреЗрд╢ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╡реНрдпрд╡рд╣рд╛рд░, рд╕реНрдерд┐рддрд┐ рдФрд░ рдЕрдиреНрдп рдХреНрд░рд┐рдпрд╛рдУрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рд╣реИред рдЕрднрд┐рдиреЗрддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЕрдЧрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдкрд░рд┐рдгрд╛рдо



рдкреНрд░рддреНрдпреЗрдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдЕрдкрдиреЗ minuses рдФрд░ pluses рд╣реИрдВ рдФрд░ рдЖрдк рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╕рд▓рд╛рд╣ рдирд╣реАрдВ рджреЗ рд╕рдХрддреЗред
рдЬрд╛рд╡рд╛ рдореЗрдВ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдареАрдХ-рдареАрдХ рддрд╛рд▓реЗ рдФрд░ рдЧреИрд░-рдЕрд╡рд░реБрджреНрдз рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛ рд╕рдВрдпреЛрдЬрдиред рдХреНрд▓реЙрдЬреНрдпреЛрд░ рдореЗрдВ, рд╡рд┐рдкрд░реАрдд рдЯреНрд░рд╛рдВрд╕рдПрдХреНрд╢рдирд▓ рдореЗрдореЛрд░реА рдФрд░ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдПрдВ рд╣реИрдВред рд▓реЗрди-рджреЗрди рдХреА рд╕реНрдореГрддрд┐, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдПрдХ рдЖрд╢рд╛рдЬрдирдХ рдЙрдкрдХрд░рдг рд╣реИ (рдореИрдВ рдкрд╛рдардХ рдХреЛ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рджреГрд╢реНрдп рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВ)ред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЕрдЧрд▓реА рдмрд╛рд░ рдЬрдм рдЖрдк рдХрд┐рд╕реА рд╕рд┐рд╕реНрдЯрдо, рдореЙрдбреНрдпреВрд▓ рдпрд╛ рд╡рд░реНрдЧ рдХреЛ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд░реЗрдВрдЧреЗ, рддреЛ рдЖрдк рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдХреЛ рдпрд╛рдж рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЬреЛ рдЖрдкрдХреЛ рд╕реВрдЯ рдХрд░реЗрдЧрд╛ рдЙрд╕реЗ рдЪреБрдиреЗрдВред

рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдФрд░ рд╕реБрдЭрд╛рд╡реЛрдВ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рд╣реИред

Source: https://habr.com/ru/post/In216049/


All Articles