package Foo; use threads; use threads::shared; sub new { my ($class, $share) = @_; print "Init\n"; return $share ? bless shared_clone {} : bless {}; } DESTROY { print "Destroy\n"; } package main; use common::sense; use threads; use threads::shared; use Scalar::Util qw/weaken/; use Devel::Refcount qw(refcount); say "Test 1 (using two refcounts)"; { my %BAR :shared; my $foo = Foo->new(1); say refcount($foo); $BAR{foo} = $foo; say refcount($foo); } say "Test 2 (single refcount)"; { my %BAR :shared; my $foo = Foo->new(1); say refcount($foo); $BAR{foo} = $foo; #say refcount($foo); } say "Test 3 (no weaken)"; { my %BAR :shared; my $foo = Foo->new(1); $BAR{foo} = $foo; # weaken($BAR{foo}); } say "Test 4 (with weaken)"; { my %BAR :shared; my $foo = Foo->new(1); $BAR{foo} = $foo; weaken($BAR{foo}); }